3

wpf アプリケーションの開発に MVVM (prism) を使用しています。

私のモデル クラス「StandardContact」の 1 つは、ビューに直接バインドされたプロパティを持っています。IDataErrorInfo を使用して、モデルにエラーがあるかどうかを追跡して通知します。モデルにエラーがある場合は、「保存」コマンドを無効にします。

ユーザーがデータを入力したら、StandardContact.PropertyChanged ハンドラーを使用して、「保存」コマンドを実行できるかどうか (つまり、ユーザーが入力したモデル データが有効かどうか) を確認します。問題は、StandardContact.PropertyChanged ハンドラーが IDataErrorInfo の検証コードの前に呼び出されるため、「保存」コマンドの CanExecute がコマンドを実行できるかどうかを正しく反映しないことです。私が探しているのは、CanExecute が実行される前に IDataErrorInfo 検証を実行して、CanExecute がモデル内の最新のデータに対してクエリを実行し、それが有効かどうかを判断することです。これが私が使用しているサンプルコードです

モデル:

public class StandardContact :EntityBase, IDataErrorInfo
{
    public virtual string Name 
    {
        get { return _name; }
        set { SetField(ref _name, value, () => Name); }
    }

    //...
    //Validators
    public string this[string propertyName] 
    {
        get 
        {
            string error = null;
        //....
    }

ビューモデル

public class SContactEditViewModel : NotificationObject, INavigationAware 
{
    //....
        StandardContact.PropertyChanged += 
            new PropertyChangedEventHandler(StandardContact_PropertyChanged);

    void StandardContact_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    {
        //Requery if command can execute
        SaveNewCommand.RaiseCanExecuteChanged(); 
    }
}
4

2 に答える 2

0

独自の MVVM ライブラリを調べました。ViewModels インデクサー (この場合はモデル インデクサー) 内で、要求されたプロパティが検証されます。

public string this[string propertyName]
{
    get
    {
        string result = null;

        if (CanDataErrorValidated(propertyName))
        {
            int errorCount = CurrentValidationAdapter.ErrorCount();
            result = ValidateProperty(propertyName, GetValidateValue(propertyName));

            // if the error flag has been changed after validation
            if (errorCount != CurrentValidationAdapter.ErrorCount())
            {
                RaisePropertyChanged(PropHasError);
                RaisePropertyChanged(PropError);
            }
        }
        else
        {
            RaisePropertyChanged(PropHasError);
            RaisePropertyChanged(PropError);
        }

        return result;
    }
}

したがって、問題の解決策は、要求されたプロパティをオンザフライで検証するようです。

于 2012-04-18T11:21:34.650 に答える
0

私はプリズムを使用しませんが、何らかの IsValid メソッドまたはプロパティを公開している場合は、それを使用してエラー チェックをトリガーできます。そうでない場合は、自分で書くことができます。

プリズムなしの基本的な考え方は、次のようにして IDataErrorInfo.Error を活用する必要があることです。

bool IsValid{ get{return string.IsNullOrEmpty(Error) }  // trigger validation

次に、Save.CanExecute メソッド内で

return IsValid;    // trigger validation on demand

HTH、
ベリル

于 2012-04-18T02:04:54.310 に答える