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/