2012-07-09 4 views
0

ViewModel에 의해 노출 된 속성에 따라 응용 프로그램 설정 페이지를 작성하려고합니다. MVVM과 .Net 4.0을 사용하고 있습니다. ViewModel은 "설정 값 그룹"의 단일 콜렉션을 노출합니다. 그룹은 서로 종속적이고 도메인에 대한 논리적 그룹에 속하는 속성을 나타냅니다. 보기에서 설정 페이지는 아래와 같은 DataTemplate을을 사용하여 만들어집니다 : - :IDataErrorInfo 유효성 검사가 UI에서 데이터 템플릿을 사용하는 동안 트리거되지 않았습니다.

public class SettingGroup1 : INotifyPropertyChanged, IDataErrorInfo 
{ 
    public double Field1value { get; private set; } 
    public double Field2value { get; private set; } 

    private double mField1; 
    public double Field1value 
    { 
     get { return mField1; } 
     set 
     { 
      if (mField1 != value) 
      { 
       mField1 = value; 
       RaisePropertyChanged(() => Field1value); 
      } 
     } 
    } 

    private double mField2; 
    public double Field2value 
    { 
     get { return mField2; } 
     set 
     { 
      if (mField2 != value) 
      { 
       mField2 = value; 
       RaisePropertyChanged(() => Field2value); 
      } 
     } 
    } 

    public string Error 
    { 
     get { return null; } 
    } 

    public string this[string property] 
    { 
     get 
     { 
      string errorMsg = null; 
      switch (property) 
      { 
       case "Field1value": 
        if (Field1value < 0.0) 
        { 
         errorMsg = "The entered value of Field1 is invalid !"; 
        } 
        if (Field1value < Field2value) 
        { 
         errorMsg = "The Field1 should be greater than Field2 !"; 
        } 
        break; 
      } 
      return errorMsg; 
     } 
    } 
} 

그리고 마지막으로 뷰 모델 노출하는

<DataTemplate x:Key="contentSettingGroup1"> 
    <TextBlock Text="{Binding Field1Description}" /> 
    <TextBox Text="{Binding Field1Value, Mode=TwoWay}" Grid.Column="2" /> 

    <TextBlock Text="{Binding Field2Description}" /> 
    <TextBox Text="{Binding Field2Value, Mode=TwoWay}" Grid.Column="6" /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type vm:SettingGroup1}"> 
    <HeaderedContentControl Header="{Binding}" HeaderTemplate="{StaticResource titleArea}" Content="{Binding}" ContentTemplate="{StaticResource contentSettingGroup1}" /> 
</DataTemplate> 

은 그럼 아래와 같이 "설정의 그룹"을 표현하는 뷰 모델 모듈의 클래스가 설정 등 그룹의 컬렉션 :

public ObservableCollection<object> Settings 
     { 
      get 
      { 
       var pageContents = new ObservableCollection<object>(); 
       var group1 = new SettingGroup1(); 
       group1.Field1.Description = "Description value 1"; 
       group1.Field1.Value = mValue1; 
       group1.Field2.Description = "Description value 2"; 
       group1.Field2.Value = mValue2; 
       pageContents.Add(group1); 

       // add other groups of controls 
       // ... 
       return pageContents; 
      } 
     } 

문제점 : 속성 세터라고하지만, 데이터 유효성 검사가 칼을하지 않습니다 UI 값이 변경 될 때마다 표시됩니다.. IDataErrorInfo 구현을 ViewModel 클래스에 넣으려고했지만 아무 것도 작동하지 않습니다. 이러한 응용 프로그램 설정은 많은 프로젝트에서 사용되므로 각 응용 프로그램에 대해 중복 XAML을 사용하지 않으므로 설정 그룹을 사용해야합니다. 참고 : viewmodel이 UI가 바인딩하는 속성을 노출하지 않습니다. Field1Value하지만 캡슐화 된 객체를 노출합니다.

답변

2

바인딩하려는 속성의 유효성을 검사해야한다는 의견이 표시되지 않습니다. 바인딩에서 "ValidatesOnDataErrors = true"를 사용하십시오.

<TextBox Text="{Binding Field1Value, Mode=TwoWay, ValidatesOnDataErrors=True}" Grid.Column="2" /> 
+0

감사합니다. 그것은 효과가있다. –