5

複数のフィールド間の検証に問題があります。たとえば、というRangeDateViewModel名前のクラスの2つのインスタンスを含むという名前のViewModelがありますDateViewModel。これらは、それぞれ開始日と終了日を表します。

したがって、私のバインディングは次のようになります。

<TextBox Text="{Binding StartDate.Date, ValidateOnDataError=True}">
<TextBox Text="{Binding EndDate.Date, ValidateOnDataError=True}">

RangeDateViewModelのクラスはIDataErrorInfoインターフェースを実装しています。私の計画では、次のような関数RangeDateViewModelで検証ロジックを適用することにより、開始日が終了日より前であることを検証します。IDataErrorInfo["propertyName"]

public string this[string columnName]
{
     get
     {
        return ValidationError();
     }
}

問題は、これが呼び出されることはなく、代わりに各クラスにIDataErrorInfo存在するプロパティが呼び出されることです。DateViewModel

RangeDateViewModelこれは、バインドされたプロパティが同じレベルではなく、子の内部にあるためだと思いますDateViewModel

私のニーズは非常に基本的であり、この問題の簡単な解決策がなければならないと思います。

代わりにValidationRulesを使用しようとしIDataErrorInfoましたが、ValidationRulesから現在の検証ステータスをViewModelに通知する際に問題が発生しました。

4

2 に答える 2

1

public string this[string columnName]先週、電話がかかってこなかったという問題がありました。

解決策は簡単でした。バインディング WPF バインディング エンジンは、ViewModel のネストに従うことができませんでした。

現在の DataContext である ViewModel にプロパティを実装する必要があると想定していましたが、代わりに、コントロールにバインドされている ViewModel に実装する必要があります。

例:

<TextBox Text="{Binding Path=ProductViewModel.DescriptionViewModel.ProductName,
                                    Mode=TwoWay,
                                    ValidatesOnDataErrors=True,
                                    NotifyOnValidationError=True}" />

DescriptionViewModelバインドされたプロパティを含むクラスを次に示します。IDataErrorInfoそのクラスに実装する必要があります(それを含む可能性のある階層の上の別のクラスではなく)、すべてが正常に機能しますProductViewModel

于 2011-12-06T12:24:45.013 に答える
1

次のアプローチを使用してみてください。

  1. DataTemplatefor を作成しますDateViewModel

    <DataTemplate DataType="{x:Type ViewModels:DateViewModel}">
        <TextBox Text="{Binding Date}">
    </DataTemplate>
    
  2. この ViewModel のインスタンスを ContentControl にバインドし、そのバインディングに設定ValidateOnDataErrorします。true

    <ContentControl Content="{Binding StartDate, ValidateOnDataError=True}" />
    <ContentControl Content="{Binding EndDate, ValidateOnDataError=True}" />
    
  3. andのイベントにサブスクRangeDateViewModelライブし、発生したときに、/でイベントを発生させます。PropertyChangedStartDateEndDatePropertyChangedStartDateEndDate

    StartDate.PropertyChanged += (s, e) => InvokePropertyChanged("StartDate");
    EndDate.PropertyChanged += (s, e) => InvokePropertyChanged("EndDate");
    
于 2011-12-06T09:54:11.277 に答える