C# MVVM命令绑定
我正在尝试学习MVVM模式。我遇到的主要问题是学习应该在哪里声明、创建和绑定命令对象 2个例子:C# MVVM命令绑定,c#,wpf,mvvm,commandbinding,C#,Wpf,Mvvm,Commandbinding,我正在尝试学习MVVM模式。我遇到的主要问题是学习应该在哪里声明、创建和绑定命令对象 2个例子: 我有一个像开关板或主菜单一样的主窗体。选择按钮1并显示视图1,选择按钮2并显示视图2。伟大的现在我想回到主窗体,所以我需要在视图1(和视图2)上有一个名为“主菜单”的按钮。我应该在哪里定义命令和命令处理程序,以便绑定到“ShowMainMenu”命令?我可以在View2ViewModel中创建它们,但是我没有显示主视图的权限?或者,我可以在主视图模型中创建thim,但是如何在子视图模型中绑定它们(我
感谢您的帮助。主模型可以为每个UCxViewModel提供一个属性,或者更简单的是,提供一个ViewModels列表。 “Show”命令将创建相应的UVxViewModel,订阅由UVxViewModel发布的“OnClose”事件,并将其添加到列表中。 MainView有一个绑定到此列表的控件(例如选项卡控件)和定义每个UCxViewModel要使用的视图的数据模板。 当UVxViewModel触发其OnClose事件时,MainModel会将其从列表中删除,从而导致相应的视图“关闭” 对于“添加项目”部分,ViewModels应共享相同的项目列表(模型)。然后,UC2ViewModel可以添加一个项,UC1View将得到更新(前提是列表实现INotifyCollectionChanged) 我发现理解MVVM非常有帮助。1)您可以从一个基本ViewModel继承View1Model和View2Model,并在其中定义ShowMain菜单 或者(这是我的方法) 使用ContentPresenter创建RootView,它将显示您的所有视图。使用属性ViewContent创建RootVeiwModel。将ContentPresenter的内容属性绑定到RootViewModel的ViewContent属性。您可以使用
object
作为ViewContent的类型,但我建议您定义MainvViewW1Model、View1Model和View2Model支持的界面。更改ViewContent必须引发propertyChangedEvent。
在RootViewModel中定义showmainviewmodel命令,该命令只会将ViewContent更改为MainViewModel(它将显示为MainView)。然后将View1和View2中按钮的命令属性绑定到该命令,例如:
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type RootView}},
Path=DataContext.ShowMainViwe}
有一些代码可以解释我想说的话:
RootView.xaml
...
<ContentPresenter Content={Binding ViewContent} />
...
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;
}
}
...
}
在第一个exmaple中设置ViewContent=new MainViewModel());这应该是一个窗口/用户控件吗?或者您真的将当前内容设置为视图模型吗?它是视图模型。如果将ContentPresenter放置在视图中并将内容属性绑定到ViewModel,它将显示为关联视图。是否使用视图模型关联,如下所示:
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;
}
}
...
}