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