c# - 在不同的 View 模型之间共享PropertyChanged数据

标签 c# .net wpf mvvm

MyproblemDescription

在上图中,您可以看到
ViewModelA具有属性IsPopupOpen。在该属性的更改(值)上,我希望ViewModelB和ViewModelC会得到通知。

现在,ViewmodelB和ViewModelC具有属性IsUserCtlVisible( bool )。
现在我想如果IsPopupOpen属性更改(ViewModelA的),则IsUserCtlVisible属性应该从ViewModelA获取值并获取该值。
请帮我。

最佳答案

有一些选择:
1.使用prism,然后在这种情况下,使用发布和订阅方法分别触发事件和订阅。
2.如果您不想使用prism,则使用一个事件来触发该事件并在要订阅该事件的另一个 View 模型中订阅该事件。
例子:
在第一个 View 模型上使用以下代码,该代码将随着属性IsPopupOpen的更改而触发

public event MyHandler Tick;
        public EventArgs e = null;
        public delegate void MyHandler(ViewModelBase m, EventArgs e);
        MenuItemViewModel menuVM = new MenuItemViewModel();
        UpperWorkstationViewModel UpperVM = new UpperWorkstationViewModel();
        public bool _isPopupOpen = true;
        public virtual bool IsPopupOpen
        {
            get { return _isPopupOpen; }
            set
            {
                _isPopupOpen = value;
                OnPropertyChanged("IsPopupOpen");
                menuVM.Subscribe(this);
                UpperVM.Subscribe(this);
                if (Tick != null)
                { Tick(this, e); }

                //this.SomeEvent.Invoke(IsPopupOpen);                
            }
        }

现在,上面的代码将触发事件并预订事件,将以下代码粘贴到任何viewmodel中。我已经尝试过使用2个viewmodels编写此代码,并且它可用于2个单独的viewmodel(MenuItemViewModel和UpperWorkstationViewModel)
public void Subscribe(MainWindowViewModel m)
        {
            m.Tick += new MainWindowViewModel.MyHandler(HeardIt);
        }
        private void HeardIt(ViewModelBase m, EventArgs e)
        {
            if (m != null)
            {
                if ((bool)(((UI.Viewmodel.MainWindowViewModel)m).IsPopupOpen))
                    IsUpperWSUsrCtlVisible = false;
                else
                    IsUpperWSUsrCtlVisible = true;
            }
            CommandManager.InvalidateRequerySuggested();

            //_dispatcher.BeginInvoke(DispatcherPriority.DataBind,
            //        new DispatcherOperationCallback(ScheduleTransferOperation),
            //        null);
        }

现在运行代码,您会发现该事件将在所有放置上述代码段的viewmodel中触发。

关于c# - 在不同的 View 模型之间共享PropertyChanged数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35898651/

相关文章:

c# - 如何从标志枚举中获取数值?

c# - backgroundWorker 的目的是什么? (我可以得到一些示例代码来理解吗?)

c# - WebService客户端异常: Cannot Import wsdl:binding

wpf - 在contentpresenter : Binding inside ContentTemplate is not working上设置Datacontext

c# - 如何在 C# 中执行超过 1 行的 sql 命令

c# - EF : The property 'Street' is not a declared property on type 'Address'

c# - linq distinct 没有给出不同的结果

.net - Oracle.Dataaccess 位于 GAC 中。我可以控制我使用的版本吗?

c# - 绑定(bind)内部绑定(bind) WPF

wpf - 生成的 Xaml 代码和自定义 C# 代码不会产生相同的输出?