WPF:XAML未识别或无法访问整数CLR属性。

4

我在WPF中有一个自定义控件。我添加了两个普通的CLR属性,类似于这样:

private int _ChordFrom = 0;
public int ChordFrom
{
    get { return _ChordFrom; }
    set { _ChordFrom = value; }
}

private int _ChordTo = 0;
public int ChordTo
{
    get { return _ChordTo; }
    set { _ChordTo = value; }
}

我使用普通的CLR属性,因为我不想将这些属性绑定到任何其他依赖项。我只想在实例化控件时在XAML中设置值。
在XAML中,通过Intellisense找到这些属性,但是在构建项目时会出现错误:
“成员“ChordFrom”未被识别或不可访问。” “成员“ChordTo”未被识别或不可访问。”
XAML代码如下:
<TabItem Header="CHORDS I">
    <Grid x:Name="_gridChords_1" Background="AliceBlue">
        <mg:MidiChordGrid x:Name="gridMidiChordGrid_1" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  ChordFrom="0" ChordTo="7"/>
    </Grid>
</TabItem>

我有三个疑问:

  • 为什么Intellisense会在XAML中提供属性,但它们是不可访问的?

  • 如果我关闭所有XAML窗口并重新构建项目,则错误会消失。

  • 即使可以无错误地构建项目,属性也没有设置。

答案 | 答案 | 答案 | 答案 | 答案 | 答案 | 答案

感谢所有回答,但解决方案/错误在我的代码中。我忘记在设置这两个CLR属性后更新我的网格。对此很抱歉。

但这里有一些你可能想知道的事实:

  • 您可以在WPF XAML中使用和设置普通CLR属性。我进行了检查,并且属性是从XAML中设置的。
  • “未被识别或不可访问”的错误似乎是VS的一个bug,因为该项目是可构建的。
  • 如果在VS中关闭XAML文件,则不会再出现构建错误。

在这一点上,对我来说,使用普通的CLR属性是最好的解决方案,因为我传递给控件的值对于每个控件实例都是硬编码的,并且它们在运行时不会改变。当然,如果这些值在运行时发生更改,我会想要使用附加的依赖属性。

谢谢您的快速答复,但最终这是我的错误。


谢谢Piotr。我已经使用依赖属性进行了测试,但是遇到了相同的错误。我从昨天开始就一直在处理这个问题。我尝试过普通DP,附加DP和现在的CLR属性。 - Michael
1
如果您不使用数据绑定,实际上可以在XAML中使用普通属性,就像这样,所以那不是问题。 - Benoit Catherinet
1
如果我关闭所有的XAML窗口,重新构建项目,错误就会消失。这意味着实际上是设计师的错误,而不是构建错误。如果您尝试运行它会发生什么? - Benoit Catherinet
如果我运行它,属性没有被设置。 - Michael
还有,您能给出 MidiChordGrid 类的定义吗? - Benoit Catherinet
显示剩余5条评论
1个回答

2

我确认这似乎是一个Visual Studio的bug,就像问题中提到的那样。 我给控件添加了一些属性,花了一个小时试图弄清楚为什么它无法构建。阅读了上面的帖子后,我只需关闭XAML文件,点击构建,然后它成功构建了。 使用VS 2013社区SP4。


你刚刚为我节省了一个小时的时间。谢谢! - Nick Louloudakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接