0

ViewModelによって公開されているプロパティに応じて、アプリケーション設定ページを作成しようとしています。MVVMで.Net4.0を使用しています。ViewModelは、「設定値のグループ」の単一のコレクションを公開します。グループは、相互に依存し、ドメインへの論理グループに属するプロパティを表します。ビューの設定ページは、次のようにDataTemplateを使用して作成されます。-

<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>

次に、ViewModelモジュールに、「設定のグループ」を表すクラスがあります。

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;
        }
    }
}

そして最後に、viewModelはそのような設定のグループのコレクションを公開します。

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は必要ないため、設定のグループを使用する必要があります。 注:ビューモデルは、UIがバインドしているプロパティ(たとえばField1Value)を公開していませんが、カプセル化されたオブジェクトを公開しています。

4

1 に答える 1

2

バインドしているプロパティを検証する必要があることをビューに伝えていません。バインディングで「ValidatesOnDataErrors = true」を使用します。

<TextBox Text="{Binding Field1Value, Mode=TwoWay, ValidatesOnDataErrors=True}" Grid.Column="2" />
于 2012-07-09T12:39:24.753 に答える