我在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属性是最好的解决方案,因为我传递给控件的值对于每个控件实例都是硬编码的,并且它们在运行时不会改变。当然,如果这些值在运行时发生更改,我会想要使用附加的依赖属性。
谢谢您的快速答复,但最终这是我的错误。