我显然不会在某个地方得到这个。
我创建了一个UserControl,它的骨架是:
private readonly DependencyProperty SaveCommandProperty =
DependencyProperty.Register("SaveCommand", typeof(ICommand),
typeof(ctlToolbarEdit));
private readonly DependencyProperty IsSaveEnabledProperty =
DependencyProperty.Register("IsSaveEnabled", typeof(bool),
typeof(ctlToolbarEdit), new PropertyMetadata(
new PropertyChangedCallback(OnIsSaveEnabledChanged)));
public ctlToolbarEdit()
{
InitializeComponent();
}
public bool IsSaveEnabled
{
get { return (bool)GetValue(IsSaveEnabledProperty); }
set { SetValue(IsSaveEnabledProperty, value); }
}
public static void OnIsSaveEnabledChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
((ctlToolbarEdit)d).cmdSave.IsEnabled = (bool)e.NewValue;
}
#region Command Handlers
public ICommand SaveCommand
{
get { return (ICommand)GetValue(SaveCommandProperty); }
set { SetValue(SaveCommandProperty, value); }
}
private void cmdSave_Click(object sender, RoutedEventArgs e)
{
if (SaveCommand != null)
SaveCommand.Execute(null);
}
#endregion
优异。你可以看到我正在做什么...处理按钮的click事件,并基本上启动命令。
表单(暂时调用Form1 ......但请注意,这实际上是一个UserControl:我相信,MVVM中的常见做法)托管控件有以下几行:
<ctl:ctlToolbarEdit HorizontalAlignment="Right" Grid.Row="1"
SaveCommand="{Binding Save}" IsSaveEnabled="{Binding IsValid}" />
这很有效。我的 ViewModel 中有 ICommand ,名为'保存', ViewModel 正确显示 IsValid 属性。
到目前为止非常好。
现在我想在Form2上使用我的新用户控件(这也是一个用户控件 - 我相信在MVVM上的常用做法)。碰巧的是,Form1和Form2同时出现在屏幕上。
它编译,但我得到一个运行时异常:
'SaveCommand'属性已由'ctlToolbarEdit'注册。“
......让我相信我根本没有'命令'。
为什么我不能在多个地方使用我的用户控件?
如果我不能,你会建议另一种方法吗?
非常令人沮丧!
感谢您的帮助。
答案 0 :(得分:4)
尝试将依赖项属性设置为静态。否则,每次实例化一个新控件时都会重新注册。你对MVVM命令的使用看起来不错,听起来你对它有很好的把握。