Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM命令绑定_C#_Wpf_Mvvm_Commandbinding - Fatal编程技术网

C# MVVM命令绑定

C# MVVM命令绑定,c#,wpf,mvvm,commandbinding,C#,Wpf,Mvvm,Commandbinding,我正在尝试学习MVVM模式。我遇到的主要问题是学习应该在哪里声明、创建和绑定命令对象 2个例子: 我有一个像开关板或主菜单一样的主窗体。选择按钮1并显示视图1,选择按钮2并显示视图2。伟大的现在我想回到主窗体,所以我需要在视图1(和视图2)上有一个名为“主菜单”的按钮。我应该在哪里定义命令和命令处理程序,以便绑定到“ShowMainMenu”命令?我可以在View2ViewModel中创建它们,但是我没有显示主视图的权限?或者,我可以在主视图模型中创建thim,但是如何在子视图模型中绑定它们(我

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

2个例子:

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

  • 我在一个主窗口视图中有两个用户控件,我们称它们为MainView,UC1和UC2。每个视图都有ViewModel MainViewModel、UC1ViewModel、UC2View Model。我在UC1上有一个叫做“AddItem”的按钮。它应该在UC2上的列表中添加一项。 设置“AddItemCommand”并绑定到它的当前方式是什么。该命令应位于MainViewModel、Uc1ViewModel还是UC2ViewModel中?我该如何约束它


  • 感谢您的帮助。

    主模型可以为每个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;
            }
        }
        ...
    }