ViewModels之间的Caliburn微通信

时间:2012-12-07 09:29:39

标签: viewmodel communication caliburn.micro

希望你能帮助我。首先,让我解释一下我的问题。

我有两个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获取数据,但我无法设置或通知它们。是对的吗?我是否必须使用“事件聚合器”来实现我的目标,还是有其他更简单的方法?

1 个答案:

答案 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属性