2012-12-07 80 views
0

希望你能幫助我。首先,讓我解釋我的問題是什麼。Caliburn ViewModels之間的微通信

我有兩個ViewModels。第一個例如有存儲在幾個文本框中的信息。

例如

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

其他視圖模型有一個按鈕,我想從文本框保存這些數據。

它看起來像這樣

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

不知道你在做什麼你的viewmodels - 爲什麼你在屬性訪問器實例化viewmodels?

這條線是幹什麼的?

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

我無法從你的設置肯定是你沒提到很多關於建築,但sincce你應該有每個視圖模型的實例,一定是有什麼在進行/管理兩個(或一個管理其他)

如果你有一個管理另一個,你通過具體的引用來實現這個,你可以通過直接訪問屬性來獲取其他視圖模型的字段,並將子項的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,如果可以的話,可以節省在父虛擬機上創建CanSave屬性的需要

+0

感謝您的提示。它確實工作得很好。我知道有辦法做到這一點。 – Insight