我有两个ViewModel。第一个有例如将信息存储在多个文本框中。
例如
private static string _tbxCfgLogfile;
public string TbxCfgLogfile
{
get { return _tbxCfgLogfile; }
set
{
_tbxCfgLogfile = value;
NotifyOfPropertyChange(() => TbxCfgLogfile);
}
}
另一个ViewModel有一个Button,我想从文本框中保存这些数据。
看起来像这样
public bool CanBtnCfgSave
{
get
{
return (new PageConfigGeneralViewModel().TbxCfgLogfile.Length > 0 [...]);
}
}
public void BtnCfgSave()
{
new Functions.Config().SaveConfig();
}
我怎样才能让“CanBtnCfgSave”知道条件是否满足?
我的第一次尝试是
private static string _tbxCfgLogfile;
public string TbxCfgLogfile
{
get { return _tbxCfgLogfile; }
set
{
_tbxCfgLogfile = value;
NotifyOfPropertyChange(() => TbxCfgLogfile);
NotifyOfPropertyChange(() => new ViewModels.OtherViewModel.CanBtnCfgSave);
}
}
它不起作用。当我记得正确时,我可以从每个ViewModel获取数据,但我无法设置或通知它们。是对的吗?我是否必须使用“事件聚合器”来实现我的目标,还是有其他更简单的方法?
答案 0 :(得分:0)
不确定您在viewmodel中正在做什么 - 为什么要在属性访问器中实例化viewmodel?
这条线在做什么?
return (new PageConfigGeneralViewModel().TbxCfgLogfile.Length > 0 [...]);
我无法确定你的设置,因为你没有提到很多关于架构的内容,但是你应该有一个每个viewmodel的实例,必须有一些东西进行/管理这两个(或一个管理另一个)
如果你有一个管理另一个并且你通过具体的引用实现了这个,你可以通过直接访问属性来获取另一个viewmodel中的字段,并挂钩子事件的PropertyChanged
事件来通知父母
class ParentViewModel : PropertyChangedBase
{
ChildViewModel childVM;
public ParentViewModel()
{
// Create child VM and hook up event...
childVM = new ChildViewModel();
childVM.PropertyChanged = ChildViewModel_PropertyChanged;
}
void ChildViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
// When any properties on the child VM change, update CanSave
NotifyOfPropertyChange(() => CanSave);
}
// Look at properties on the child VM
public bool CanSave { get { return childVM.SomeProperty != string.Empty; } }
public void Save() { // do stuff }
}
class ChildViewModel : PropertyChangedBase
{
private static string _someProperty;
public string SomeProperty
{
get { return _someProperty; }
set
{
_someProperty = value;
NotifyOfPropertyChange(() => SomeProperty);
}
}
}
当然这是一种非常直接的方法 - 你可以在子VM上创建与CanSave
的绑定(如果有效),从而无需在父级上创建CanSave
属性