Context Menu使用MVVM动态创建UI控件的命令

时间:2013-05-08 21:04:52

标签: c# wpf xaml mvvm icommand

希望这个问题不是太笼统,但我刚刚开始使用WPF而且我正在敲打这个问题。

我正在开发一个使用动态创建的控件的应用程序。但是目前我无法弄清楚如何创建命令并向当前窗口添加更多控件,因为这些命令仅在ViewModel中创建时无法看到View。但是我无法将所有内容保留在XAML中,因为除了少数最初为空的堆栈面板之外的所有控件都是动态的。我觉得我在这里很容易丢失一些东西。

所以这里我有绑定

<MenuItem Header="LabelMenuItem" Command="{Binding Path=SpawnLabel}"/>

这里我有命令

 public ICommand SpawnLabel { get { return new DelegateCommand(OnSpawnLabel); } }

Delegate命令的工作方式类似于此处定义的中继命令。

public class DelegateCommand : ICommand
    {
        private readonly Action _command;
        private readonly Func<bool> _canExecute;
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }


       remove { CommandManager.RequerySuggested -= value; }
    }

    public DelegateCommand(Action command, Func<bool> canExecute = null)
    {
        if (command == null)
            throw new ArgumentNullException();
        _canExecute = canExecute;
        _command = command;
    }

    public void Execute(object parameter)
    {
        _command();
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute();
    }

}

这在视图模型中有效但我无法弄清楚如何在视图中使其工作(或在不破坏MVVM原则的情况下与视图对话)以便我可以使用创建的当前控件实际更改UI在c#。

目前,当我这样做时,我得到一个BindingExpression路径错误,这是有道理的,但我无法弄清楚如何绑定它以在视图中查找命令。

1 个答案:

答案 0 :(得分:0)

您通过事件间接与UI进行通信,如果您更改了触发PropertyChanged的属性,则UI将更新绑定,如果更改了您触发的集合CollectionChanged并添加了新控件或者删除旧的。

重要的界面是INotifyPropertyChangedINotifyCollectionChanged,只需将ItemsControl(通过ItemsSource)绑定到视图模型中的ObservableCollection<T>,然后添加到您的命令中的该集合(您可能需要使用ItemsControl.ItemTemplate为视图模型指定视图,具体取决于您使用的MVVM框架。