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하지만 캡슐화 된 객체를 노출합니다.
감사합니다. 그것은 효과가있다. –