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

C# 如何只设置一次依赖项属性覆盖?,c#,wpf,C#,Wpf,我试图在WPF中实现一个按钮,它使用Ninject获取命令对象,这部分工作正常。当这个按钮第一次被实例化时,一切工作都完美无缺。但是,此类型的任何后续活动都会导致如下所示的问题: internal class MyButton : Button { public MyButton() { SetOverrides(); } public void SetOverrides() { var controller = App.k

我试图在WPF中实现一个按钮,它使用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
             }
            );
    }
}

请告知..

我想得太多了,因为这是最终的解决方案:

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;
        }
    }
}
内部类MyButton:按钮
{
公共MyButton()
{
this.Loaded+=MyButton\u Loaded;
}
已加载私有无效MyButton_(对象发送方,System.Windows.RoutedEventArgs e)
{
如果(!App.IsInDesignMode)
{
var controller=App.kernel.Get(“SomeCommand”);
this.CommandParameter=Tag;
这个命令=控制器;
}
}
}

哇!感谢大家的帮助……

您能让您的
设置覆盖
方法
静态
吗?然后从静态构造函数而不是实例构造函数调用它。@StevenRands问题是Ninject可能还没有准备好用于
App.kernel.Get(“SomeCommand”)(这就是我删除答案的原因)。我想你可能只需要使用选项1。@ScottChamberlain,这不会使你的答案无效。正如MSDN上明确指出的,对OverrideMetadata的调用只能在静态构造函数中执行。即使使用选项1,CommandParameter的默认值仍会被设置为第一个按钮的Tag属性的当前值。因此,随后创建的MyButton实例都将获得此标记值作为其CommandParameter的默认值。@clemens当然就是这样,它将覆盖放在静态构造函数中,谢谢,我甚至没有想到这个!!!!
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;
        }
    }
}