MVVM命令绑定

thr*_*rag 5 c# wpf mvvm commandbinding

我正在尝试学习MVVM模式.我遇到的主要问题是学习我应该在哪里声明,创建和绑定命令对象.

2个例子:

  1. 我有一个主要形式,就像一个开关板或主菜单.显示选择按钮1和视图1,选择按钮2,显示视图2.大.现在我想回到主窗体,所以我需要一个名为"主菜单"的视图1(和视图2)上的按钮.我应该在哪里定义命令和命令处理程序,以便我可以绑定到"ShowMainMenu"命令?我可以在View2ViewModel中创建它们但是我没有权限显示主视图?或者,我可以在MainView模型中创建thim但是然后如何在子视图模型中绑定它们(我根据mvvm建议使用RelayCommand obejct并且它们不会冒泡到父模型.)

  2. 我在一个主窗口视图中可以看到两个用户控件,我们称之为MainView,UC1和UC2.每个都有ViewModel MainViewModel,UC1ViewModel,UC2View Model.我在UC1上有一个名为"AddItem"的按钮.它应该在UC2的列表中添加一个项目.设置"AddItemCommand"并绑定到它的当前方法是什么.Command应该在MainViewModel,Uc1ViewModel还是UC2ViewModel?我怎么会和它结合起来.

谢谢你的帮助.

bni*_*dyc 3

1) 您可以从一个基本 ViewModel 继承 View1Model 和 View2Model 并在那里定义 ShowMainMenu。

或者(这是我的方法)

使用 ContentPresenter 创建 RootView,它将显示您的所有视图。使用属性 ViewContent 创建 RootVeiwModel。将 ContetnPresenter 的 Content 属性绑定到 RootViewModel 的 ViewContent 属性。您可以使用objectViewContent 类型,但我建议您定义 MainVView1Model、View1Model 和 View2Model 支持的接口。ViewContent 的更改必须引发 ProprtyChangedEvent。在 RootViewModel 中定义 ShowMainViewCommand ,这只会将 ViewContent 更改为 MainViewModel (并且它将显示为 MainView)。然后将 View1 和 View2 中 Button 的 Command 属性绑定到该命令,例如:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type RootView}}, 
                         Path=DataContext.ShowMainViwe}
Run Code Online (Sandbox Code Playgroud)

有一些代码可以解释我想说的内容:

根视图.xaml

...
<ContentPresenter Content={Binding ViewContent} />
...
Run Code Online (Sandbox Code Playgroud)

根视图模型.ca

class RootViewModel : INotifyPropertyCahnged
{
    ...
    private object _ViewContent;
    public object ViewContent
    {
        get {return _ViewContent;}
        set
        {
            _ViewContent = value;
            if (PropertyChanged != null)
            {
                PropertyChanged ("ViewContent");
            }

        }
    }

    private RelayCommand _ShowMainView;
    public ICommand ShowMainView
    {
        get 
        {
            if (_ShowMainView == null)
            {
                _ShowMainView = new RelayCommand(x => ViewContent = new MainViewModel());
            }
            return _ShowMainView;
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

2) 将 MainViewModel 的引用添加到 UC1ViewModel 和 UC2ViewModel - 这是影响其他控件的方式。MainViwModel 必须包含包含 UC1ViewModel 和 UC2ViewModel 的属性 第二个用户控件的项必须包含在 ObservableCollection 中。

我只是通过代码向您展示它是如何工作的:

class UC1ViewModel : INotifyPropertyChanged
{
    ...
    private MainViewModel _Parent;
    public UC1ViewModel(MainViewModel parent)
    {
        _Panert = parent;
    }

    private RelayCommand _AddItemToUC2;
    public ICommand AddItemToUC2
    {
        get
        {
            if (_AddItemToUC2 = null)
            {
                // UC2Content is UC2ViewModel
                // Items is ObservableCollection
               _AddItemToUC2 = new RelayCommand(x => _Parent.UC2Content.Items.Add(...));
            }
            return AddItemToUC2;
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)