C# 依附性奇怪的行为

C# 依附性奇怪的行为,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,我已经用dependencyproperty创建了usercontrol。 我注意到,如果dependency属性与regitered of属性同名,当我在windows中插入控件并通过xaml代码写入值时,此控件不显示标签,我需要在值后面插入代码,启动应用程序时控件显示标签 如果我更改DependencyProperty的注册名称,则控件将显示标签,而不通过codebehind传递值,并在每次我通过xaml或codebehind修改值时显示标签 这是我的用户控制。 xaml: 并通过xaml代

我已经用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();
}