依赖属性默认值不会被覆盖

时间:2019-03-05 08:44:11

标签: c# wpf data-binding wpf-controls dependency-properties

我正在尝试覆盖依赖项属性的值,但是它似乎不起作用。

在我的Xaml代码中,我有一个带有以下CommandParameter的按钮:

CommandParameter="{Binding State,Mode=OneWay}

在这里,我声明了我的依赖属性:

public class MyStateControl : UserControl
{
  public MyStateControl()
  {
      this.InitializeComponent();
  }

  public string State
  {
    get { return (string)this.GetValue(StateProperty); }
    set { this.SetValue(StateProperty, value); } 
  }
  public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", typeof(string), typeof(MyStateControl),new   PropertyMetadata("DEFAULT"));
}

,然后在这里我尝试在覆盖它之后获取该值以使用它。 当我按下按钮时,onMyCommandExecuted被调用。且obj的值为“ DEFAULT”

public class MyAdvancedStateControl : INotifyPropertyChanged
{

  public MyAdvancedStateControl()
  {
   MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata("Successfully overriden"));
  }

  private void onMyCommandExecuted(object obj)
  {
    //TODO
  }
}

我做错什么了吗?如果是这样,重写依赖项属性值的最佳方法是什么? 是否可以/可能最好将默认值设置为一个变量,然后可以从MyAdvancedStateControl轻松更改该变量? 谢谢

1 个答案:

答案 0 :(得分:1)

制作MyAdvancedStateControl static的构造函数。

  

从属属性元数据应在属性之前覆盖   系统使用依赖项属性。这等于时间   使用注册该类的类创建特定实例   依赖项属性。 仅应调用OverrideMetadata   在提供该类型的静态构造函数中执行   本身作为此方法的forType参数,或通过类似方法   实例化。尝试在实例之后更改元数据   所有者类型存在不会引发异常,但会导致   财产制度中的行为不一致。

来自DependencyProperty.OverrideMetadata

public static MyAdvancedStateControl()
{
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata("Successfully overriden"));
}