在不同的视图模型之间共享PropertyChanged数据

时间:2016-03-09 17:34:18

标签: c# .net wpf mvvm

MyproblemDescription

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

现在,ViewmodelB和ViewModelC具有属性IsUserCtlVisible(bool)。 现在我想要IsPopupOpen属性更改(ViewModelA)然后IsUserCtlVisible属性应该从ViewModelA获取值并获取值。 Plz帮助我。

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用事件。当IsPopupOpen更改时,它会调用ViewModelBViewModelC订阅的事件。让此事件传递一个值,以便可以在IsUserCtlVisible属性中使用。

public class ViewModelA
{  
  public event action<bool> SomeEvent;
    //invoke event somewhere 
    SomeEvent.Invoke(/*some bool argument */)
}

public class ViewModelB
{
    public bool IsUserCtlVisible { get; set; }
    public ViewModelB()
    {
        MainViewModel mvm = new MainViewModel();

        mvm.SomeEvent += (arg) => { IsUserCtlVisible = arg; };
    }
}

这只是演示校长的一种简单方法。您可以使用dependency injectionprism event aggregator

以更清晰的方式执行此操作

答案 1 :(得分:0)

有一些选择: 1.使用prism然后在那种情况下使用发布和订阅方法分别触发事件和订阅。 2.如果您不想使用棱镜,则使用事件来触发并在您要订阅事件的另一个视图模型中订阅该事件。 例: 在第一个viewmodel上使用以下代码,该代码将通过更改Property 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中触发,你将把上面的代码片段放在哪里。