WPF 用户控件,在应用程序中的多个位置公开命令

本文关键字:位置 命令 控件 用户 应用程序 WPF | 更新日期: 2023-09-27 18:31:48

我显然没有得到这个。

我创建了一个用户控件,其基本内容是:

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

非常好。 你可以看到我在做什么...处理按钮的点击事件,基本上启动命令。

表单(让我们暂时称其为 Form1...但请注意,这实际上是一个用户控件:我相信,在 MVVM 中常见的做法)托管控件具有以下行:

<ctl:ctlToolbarEdit HorizontalAlignment="Right" Grid.Row="1" 
   SaveCommand="{Binding Save}" IsSaveEnabled="{Binding IsValid}" />

这很好用。 我的视图模型中有一个名为"保存"ICommand,并且 ViewModel 正确呈现了 IsValid 属性。

到目前为止非常好。

现在我想让我的新用户控件也位于 Form2 上(这也是一个用户控件 - 我相信在 MVVM 上是常见的做法)。 碰巧的是,Form1和Form2同时出现在屏幕上。

它可以编译,但我得到运行时异常:

'SaveCommand' 属性已被 'ctlToolbarEdit' 注册。

。让我相信我根本没有得到"命令"。

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

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

非常令人沮丧!

感谢您的任何帮助。

WPF 用户控件,在应用程序中的多个位置公开命令

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