2

我显然没有在某个地方得到这个。

我创建了一个 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

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

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

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

这很好用。我的ViewModel中有一个名为“Save”的ICommand,并且ViewModel正确显示了IsValid属性。

到目前为止非常好。

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

它编译,但我得到一个运行时异常:

'SaveCommand' 属性已由 'ctlToolbarEdit' 注册。”

...让我相信我根本没有得到“命令”。

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

如果我不能,你会建议另一种方法来做到这一点吗?

非常令人沮丧!

谢谢你的帮助。

4

1 回答 1

4

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

于 2012-04-21T12:21:26.297 回答