如何设置依赖项属性覆盖一次?

时间:2015-03-12 14:47:07

标签: c# wpf

我正在尝试在WPF中实现一个Button,它使用Ninject来获取命令对象,该部分工作正常。当第一次实例化这个按钮时,一切都完美无瑕。但是,此类型的任何后续活动都会导致以下问题:

internal class MyButton : Button
{
    public MyButton()
    {
       SetOverrides();
    }

    public void SetOverrides()
    {
        var controller = App.kernel.Get<ICommand>("SomeCommand");
        Button.CommandProperty.OverrideMetadata(typeof(MyButton),
                new FrameworkPropertyMetadata
                {
                    DefaultValue = controller
                }
             );
        Button.CommandParameterProperty.OverrideMetadata(typeof(MyButton),
             new FrameworkPropertyMetadata()
             {
                 DefaultValue = Tag
             }
            );
    }
}

问题: 我看到的错误是:&#34; PropertyMetadata已经注册了类型&#39; MyButton&#39;。&#34;

原因:   由于应用程序中存在多个这些按钮,因此不止一次调用CTOR。

我的选择是:

  1. 创建一个静态bool值,说&#34;已设置&#34;并用它来避免这个问题。
  2. 尝试检查值本身以查看它们是否已设置。
  3. 如果我将此代码移到app.cs文件中,那么我对这行代码有疑问,因为值TAG未包含在app.cs类中。如果我知道如何使这段代码说&#34;绑定到任何按钮实例的标签属性我就拥有它,但我不知道如何做到这一点。我也不知道在App.cs注册这个是不是一件好事。

    Button.CommandParameterProperty.OverrideMetadata(typeof(MyButton),
              new FrameworkPropertyMetadata()
              {
                 DefaultValue = Tag
              }
     );
    
  4. 请告知..

1 个答案:

答案 0 :(得分:0)

我过度思考这一切,因为这是最终解决方案:

internal class MyButton : Button
{
    public MyButton()
    {
        this.Loaded += MyButton_Loaded;
    }

    private void MyButton_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        if (!App.IsInDesignMode)
        {
            var controller = App.kernel.Get<ICommand>("SomeCommand");
            this.CommandParameter = Tag;
            this.Command = controller;
        }
    }
}

哇!感谢大家帮忙...