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' 注册。
。让我相信我根本没有得到"命令"。
为什么我不能在多个位置使用我的用户控件?
如果我不能,你会建议另一种方法吗?
非常令人沮丧!
感谢您的任何帮助。
尝试将依赖项属性设置为静态。否则,每次实例化新控件时都会重新注册它。否则,您对 MVVM 命令的使用看起来不错,听起来您已经很好地掌握了它。