我在 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 错误,因为该项目是可构建的
- 如果您关闭 VS 中的 XAML 文件,则不会再出现构建错误
对我来说,此时使用纯 CLR 属性是最好的解决方案,因为我传递给控件的值对于控件的每个实例都是硬编码的,并且它们在运行时不会更改。当然,如果值在运行时发生变化,我会想使用附加的 DP,但它们不会。
感谢您的快速回答,但最终这是我的错。