在应用程序中的多个位置使用暴露命令的wpf usercontrol

时间:2012-04-21 12:01:49

标签: c# wpf mvvm user-controls

我显然不会在某个地方得到这个。

我创建了一个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'注册。“

......让我相信我根本没有'命令'。

为什么我不能在多个地方使用我的用户控件?

如果我不能,你会建议另一种方法吗?

非常令人沮丧!

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

尝试将依赖项属性设置为静态。否则,每次实例化一个新控件时都会重新注册。你对MVVM命令的使用看起来不错,听起来你对它有很好的把握。