C# 依附性奇怪的行为
我已经用dependencyproperty创建了usercontrol。 我注意到,如果dependency属性与regitered of属性同名,当我在windows中插入控件并通过xaml代码写入值时,此控件不显示标签,我需要在值后面插入代码,启动应用程序时控件显示标签 如果我更改DependencyProperty的注册名称,则控件将显示标签,而不通过codebehind传递值,并在每次我通过xaml或codebehind修改值时显示标签 这是我的用户控制。 xaml: 并通过xaml代码写入值,此控件不显示标签,我需要在值后面插入代码 这是正确的、记录在案的行为 您的C# 依附性奇怪的行为,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,我已经用dependencyproperty创建了usercontrol。 我注意到,如果dependency属性与regitered of属性同名,当我在windows中插入控件并通过xaml代码写入值时,此控件不显示标签,我需要在值后面插入代码,启动应用程序时控件显示标签 如果我更改DependencyProperty的注册名称,则控件将显示标签,而不通过codebehind传递值,并在每次我通过xaml或codebehind修改值时显示标签 这是我的用户控制。 xaml: 并通过xaml代
public byte NumOfLabels{get…set…}
属性仅位于代码隐藏的“前门”,数据绑定不会使用它
为set{}
中的逻辑找到另一个解决方案。您可以在Register方法中为此添加回调
请不要在这里使用byte
。这是一个数字,请使用int
并通过xaml代码写入值,此控件不显示标签,我需要在值后面插入代码
这是正确的、记录在案的行为
您的public byte NumOfLabels{get…set…}
属性仅位于代码隐藏的“前门”,数据绑定不会使用它
为set{}
中的逻辑找到另一个解决方案。您可以在Register方法中为此添加回调
请不要在这里使用
byte
。这是一个数字,使用int
您的xaml不好。事实上,windows中使用的GridRoot与userControl中使用的GridRoot不同。为了获得更好的行为,需要在新窗口中插入usercontrol,然后设置属性。您的xaml应该是这样的
<x:Windows>
<local :MyUserControl1 NumOfLabels = 7/>
</x:Windows>
您的xaml不好。事实上,windows中使用的GridRoot与userControl中使用的GridRoot不同。为了获得更好的行为,需要在新窗口中插入usercontrol,然后设置属性。您的xaml应该是这样的
<x:Windows>
<local :MyUserControl1 NumOfLabels = 7/>
</x:Windows>
您的
NumOfLabels
属性应该这样声明:
public static readonly DependencyProperty NumOfLabelsProperty =
DependencyProperty.Register(
"NumOfLabels", typeof(int), typeof(MyUserControl1),
new PropertyMetadata(0, NumOfLabelsPropertyChanged));
public int NumOfLabels
{
get { return (int)GetValue(NumOfLabelsProperty); }
set { SetValue(NumOfLabelsProperty, value); }
}
private static void NumOfLabelsPropertyChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
((MyUserControl1)obj).LabelsRender();
}
请注意,在依赖项属性的CLR包装中,除了调用GetValue
和SetValue
之外,不应调用任何其他函数,如中所述:
实现“包装器”
。。。在除特殊情况外的所有情况下,包装器实现只应执行
分别执行GetValue和SetValue操作。原因是
在主题中讨论
您必须注册一个PropertyChangedCallback
才能对属性值更改做出反应
此外,没有必要为依赖项属性实现
INotifyPropertyChanged
,因为它们实现了自己的更改通知机制。您的NumOfLabels
属性应该这样声明:
public static readonly DependencyProperty NumOfLabelsProperty =
DependencyProperty.Register(
"NumOfLabels", typeof(int), typeof(MyUserControl1),
new PropertyMetadata(0, NumOfLabelsPropertyChanged));
public int NumOfLabels
{
get { return (int)GetValue(NumOfLabelsProperty); }
set { SetValue(NumOfLabelsProperty, value); }
}
private static void NumOfLabelsPropertyChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
((MyUserControl1)obj).LabelsRender();
}
请注意,在依赖项属性的CLR包装中,除了调用GetValue
和SetValue
之外,不应调用任何其他函数,如中所述:
实现“包装器”
。。。在除特殊情况外的所有情况下,包装器实现只应执行
分别执行GetValue和SetValue操作。原因是
在主题中讨论
您必须注册一个PropertyChangedCallback
才能对属性值更改做出反应
此外,没有必要为依赖项属性实现INotifyPropertyChanged
,因为它们实现了自己的更改通知机制
public static readonly DependencyProperty NumOfLabelsProperty=DependencyProperty.Register("NumOfLabelsP",typeof(byte),typeof(MyUserControl1), new PropertyMetadata(byte.MinValue));
<x:Windows>
<local :MyUserControl1 NumOfLabels = 7/>
</x:Windows>
public static readonly DependencyProperty NumOfLabelsProperty =
DependencyProperty.Register(
"NumOfLabels", typeof(int), typeof(MyUserControl1),
new PropertyMetadata(0, NumOfLabelsPropertyChanged));
public int NumOfLabels
{
get { return (int)GetValue(NumOfLabelsProperty); }
set { SetValue(NumOfLabelsProperty, value); }
}
private static void NumOfLabelsPropertyChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
((MyUserControl1)obj).LabelsRender();
}