0

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

我有两个 ViewModel。第一个例如在几个文本框中存储了信息。

例如

private static string _tbxCfgLogfile;
    public string TbxCfgLogfile
    {
        get { return _tbxCfgLogfile; }
        set
        {
            _tbxCfgLogfile = value;
            NotifyOfPropertyChange(() => TbxCfgLogfile);
        }
    }

另一个 ViewModel 有一个按钮,我想从文本框中保存这些数据。

它看起来像这样

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

4

1 回答 1

0

不确定您在视图模型中在做什么 - 为什么要在属性访问器中实例化视图模型?

这条线在做什么?

return (new PageConfigGeneralViewModel().TbxCfgLogfile.Length > 0 [...]);

我不能从你的设置中确定,因为你没有提到太多关于架构的事情,但是因为你应该有每个视图模型的实例,所以必须有一些东西来管理/管理这两者(或者一个管理另一个)

如果您有一个管理另一个并且您正在通过具体引用来实现这一点,您可以通过直接访问属性并挂钩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);
        }
    }
}

当然,这是一种非常直接的方法 - 如果可行,您可以CanSave在子 VM 上创建一个绑定,从而无需CanSave在父 VM 上创建属性

于 2012-12-07T11:29:24.360 回答