2012-12-07 7 views
0

잘하면 저를 도울 수 있습니다. 우선, 내 문제가 무엇인지 설명해 드리겠습니다.ViewModels 사이의 Caliburn 마이크로 통신

두 개의 ViewModel이 있습니다. 첫 번째 것은 예를 들어. 여러 텍스트 상자에 저장된 정보.

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

다른 뷰 모델 예를

를 들어

내가 텍스트 상자에서이 데이터를 저장할 버튼이 있습니다.

내가 "CanBtnCfgSave"이 조건이 충족되지 않거나 있음을 알려 수있는 방법이

public bool CanBtnCfgSave 
    { 
     get 
     { 
      return (new PageConfigGeneralViewModel().TbxCfgLogfile.Length > 0 [...]); 
     } 
    } 

    public void BtnCfgSave() 
    { 
     new Functions.Config().SaveConfig(); 
    } 

모습입니까?

내 첫 번째 시도 그것은 작동하지 않습니다

private static string _tbxCfgLogfile; 
    public string TbxCfgLogfile 
    { 
     get { return _tbxCfgLogfile; } 
     set 
     { 
      _tbxCfgLogfile = value; 
      NotifyOfPropertyChange(() => TbxCfgLogfile); 
      NotifyOfPropertyChange(() => new ViewModels.OtherViewModel.CanBtnCfgSave); 
     } 
    } 

했다. 내가 기억할 때, 각 ViewModel에서 데이터를 얻을 수는 있지만 아무런 노력없이 설정하거나 알릴 수는 없습니다. 그게 맞습니까? 내 목표를 달성하기 위해 "이벤트 통합 자"를 사용해야합니까, 아니면 다른 방법이 있습니까?

답변

0

당신이 당신의 뷰 모델에서 무엇을하고 있는지 확실하지 않습니다 - 왜 당신은 부동산 접근 자의 뷰 모델을 인스턴스화합니까?

이 행은 무엇을하고 있습니까?

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

난 당신이 아키텍처에 대한 많은 언급하지 않은로 설정에서 확신 할 수는 없지만, 각 뷰 모델의 인스턴스를해야 sincce, 관리/지휘 뭔가가 있어야 두 (또는 1

다른 하나를 관리하고 구체적인 참조를 통해이를 구현하는 경우 속성을 직접 액세스하고 자식의 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); 
     } 
    } 
} 

은 물론이 그것을 할 수있는 매우 직접적인 방법입니다 - 그 부모에 힌트

+0

감사를 CanSave 속성을 만들 필요성을 절감, 작동하는 경우에 당신은 단지 아이 VM에 CanSave에 바인딩을 만들 수 있습니다. 그것은 아주 잘 작동했습니다. 나는 그것을 할 방법이 있다는 것을 알았다. – Insight