在上面的图片中,您可以看到 ViewModelA有一个属性IsPopupOpen。在该属性的更改(值)上,我希望ViewModelB和ViewModelC得到通知。
现在,ViewmodelB和ViewModelC具有属性IsUserCtlVisible(bool)。 现在我想要IsPopupOpen属性更改(ViewModelA)然后IsUserCtlVisible属性应该从ViewModelA获取值并获取值。 Plz帮助我。
答案 0 :(得分:1)
最简单的方法是使用事件。当IsPopupOpen
更改时,它会调用ViewModelB
和ViewModelC
订阅的事件。让此事件传递一个值,以便可以在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 injection
或prism 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中触发,你将把上面的代码片段放在哪里。