2011-08-18 3 views
2

이처럼 보이는 ViewModel 클래스가 있습니다.Caliburn.Micro의 가드 속성을 뷰 모델의 개체 속성에 바인딩합니다.

class MyViewModel : Screen 
{ 
    public BindableCollection<MyObject> MyObjects { get; set; } 

    private MyObject selectedObject; 
    public MyObject SelectedMyObject 
    { 
    get { return selectedObject; } 
    set 
    { 
     selectedObject = value: 
     //some additional unrelated logic 
    } 
    } 

    public void SaveObject() 
    { 
    //some logic 
    } 
    public bool CanSaveObject{ 
    get{ 
     //logic to determine if the selectedObject is valid 
    } 
    } 

관련 코드입니다. 이제 문제.

MyObject은 세 가지 특성을 가진 클래스입니다. 보기에서 나는 MyObjects 컬렉션에 바인딩 된 ListView를 가지고 있으며 ListViewSelectedItem에 바인딩 된 세 개의 TextBoxes가 있습니다.

텍스트 상자를 채울 때 모델에서 관련 개체가 변경되지만 개체를 ​​저장하기 전에 해당 개체가 유효한 상태인지 확인하려고합니다. CanSaveObject에는 필요한 로직이 있지만, selectedObject의 속성 만 호출되었으므로 텍스트 상자가 채워질 때마다 NotifyOfPropertyChanged를 호출 할 필요가 없으므로 문제가 발생하지 않습니다. MyViewModel에 속성이 없습니다.

그래서 질문입니다. 내부의 속성을 캡슐화하는 ViewModel에 속성을 지정하지 않고이 작업을 수행하는 좋은 방법이 있습니까?

이러한 속성을 만든 다음보기에 직접 SelectedItem 대신 바인드하면 작동하지만보기 편한 방법은 해킹으로 인해보기 모드가 복잡해집니다. . 나는

public string SelectedObjectPropertyOne{ 
    get{ return selectedObject.PropertyOne; } 
    set{ 
    selectedObject.PropertyOne = value; 
    NotifyOfPropertyChange(() => SelectedObjectPropertyOne); 
    NotifyOfPropertyChange(() => CanSaveObject); 
    } 
} 

답변

2

ActionMessage.EnforceGuardsDuringInvocation 액션이 호출되기 직전에 가드 검사를 시행하도록 설정할 수 있습니다 정적 부울 필드 :) 아니에요 바랍니다. 이렇게하면 실제 저장 작업이 호출되는 것을 방지 할 수 있지만 선택한 모델을 업데이트 한 직후 가드 상태를 기반으로 한 UI 모양 문제에는 도움이되지 않습니다.

이 작업을 수행하지 않고도 MyObject 모델에 대한 VM 유형을 만들고 유효성 검사를 이동하고 거기에 논리를 저장하는 것만을 제안 할 수 있습니다. 이것은 또한 당신이보기를 단순화 할 수 있습니다 ...

+0

두 번째 제안, 또한 각 개체에 대한 VM은 당신이 그것을 제안하기 전에 사용을 끝난 솔루션이었습니다. IS는 데이터 객체의 각 속성을 래핑하는 VM의 속성을 갖기에는 다소 불필요한 것으로 보이지만 최상의 (또는 나쁜) 방법으로 보입니다. –

관련 문제