2010-02-18 1 views
3

MVVM 앱에서 작업 중이며 네트워크 매개 변수 수 (IP, 서브넷 마스크 등)를 수정하는 데 사용되는보기가 있습니다.MVVM UpdateSourceTrigger

<TextBox> 
    <TextBox.Text> 
     <Binding Path="IP" UpdateSourceTrigger="PropertyChanged"/> 
    </TextBox.Text> 
</TextBox> 

... etc 

뷰는 Save Configuration라는 버튼이 포함되어

보기는 NetworkConfigViewModel의 속성에 바인딩 텍스트 상자의 수를 포함합니다. 이 버튼은 요청시 원격 장치에 구성을 저장하는 ViewModel의 RelayCommand에 바인딩됩니다.

UpdateSourceTrigger="Explicit"을 사용하기 위해 텍스트 상자 바인딩을 수정하여 값이 수정 될 때 사용자가 명시 적으로 '구성 저장'을 클릭 할 때만 ViewModel이 업데이트되도록합니다.

나는 각 텍스트 상자에 BindingExpression.UpdateSource()으로 전화해야한다는 것을 알고 있습니다. 어떻게 MVVM 친화적 인 방식으로이 작업을 수행 할 수 있습니까? UI 요소를 인식하는 ViewModel에 새로운 RelayCommand를 추가하는 것이 올바르지 않은 것 같습니다.

답변

1

정확히, ViewModel에 View를 너무 많이 알려주는 것은 좋지 않습니다. 나는 설정의 사본을 업데이 트하는 것이 좋을 것이고 바인딩은 모든 일을 나를 위해한다. 사용자가 '구성 저장'버튼을 클릭하면 변경 사항을 저장소, 모델 등등에 추가로 전파합니다.

1

뷰 모델 바인딩에이 기능을 구현하지 마십시오. 뷰 모델에서 구현하십시오. 뷰 모델의 속성은 항상 뷰의 내용을 반영해야합니다. 뷰 모델 이라기 때문에 뷰 모델이라고 불립니다.

나는이 같은 특성을 가진 뷰 모델을 구현했기 때문에이 질문을하고 있다는 추측하고있어 :

public string MyProperty 
{ 
    get { return _Model.MyProperty; } 
    set 
    { 
     _Model.MyProperty=value; 
     OnPropertyChanged("MyProperty"); 
    } 
} 

이 작업을 수행하지 마십시오. 개인용 백킹 필드에 등록 정보 값을 저장하고 "구성 저장"메소드에서 모델 등록 정보를 업데이트하십시오.

+0

"보기 모델이기 때문에보기 모델이라고 불립니다."- 나는보기의 모델이라고 생각했습니다. – StingyJack

1

그래서 다시 예 참조 :

뷰 모델은 개인 백업의 속성에 대한 필드 대신 소위

private string _myProperty; 

public string MyProperty 
{ 

    get { return _myProperty; } 
    set 
    { 
     if (_myProperty != value) 
     { 
      _myProperty = value; 
      OnPropertyChanged("MyProperty"); 
     } 
    } 
} 

같은 모델의 속성을 노출이 있다면 어떤 것보기의 컨트롤 에 바인딩? 전용 백업 필드를 노출하는 속성에 바인딩하는 경우 모든 데이터가 어떻게 뷰에 들어 옵니까? 예를 들어, TextBox는 Model.MyProperty를 노출하지 않기 때문에 더 이상 ViewModel 속성 인 MyProperty에 바인딩 할 수 없습니다. 단순히 _myProperty를 노출하는 것입니다. Model.MyProperty에 바인딩하는 경우보기에서 :

<TextBox Text="{Binding Model.MyProperty, UpdateSourceTrigger=Explicit}" /> 
<Button Command="{Binding SaveCommand}" /> 

... TextBox에 데이터를 가져옵니다. 이제 저장 단추를 누르면 TextBox의 업데이트 된 값으로 모델을 업데이트하는 방법은 무엇입니까?

private void SaveExecute() 
{ 
    // How do we update the Model.MyProperty value? 
}