1

有効な値(文字列ではなくオブジェクト)のリストを使用するオートコンプリートボックスを作成しています。オブジェクトは直接バインドされ、ボックス(テキストボックスとドロップダウンパーツの両方)はDisplayMemberPathを使用して、テキストとして表示する内容を決定します。

ユーザーがテキストを入力できるようにしたい-テキストが有効な値の1つと一致しない場合は、ボックスに残して視覚的に無効のフラグを付けたい。

ここで、ビューモデルにバインドするとき、明らかにこの無効な値に何かを設定する必要があります。値をDependencyProperty.UnsetValueに設定してみました。これはnullとしてVMに返されます。

後でフォームを「クリア」したい場合は、VMプロパティをnullに設定しますが、値が変更されていないため、もちろんこれはコントロールにフィルターされません。

プロパティシステムは、新しい値がnullであり、古い値がUnsetValueであることに気づき、イベントを発生させることを期待していました。

明らかな何かを見逃したことがありますか?

ありがとう

4

2 に答える 2

2

WPFフレームワークにとって特別な意味を持つDependencyProperty.UnsetValueを設定する代わりに、次のような無効な値に対して独自のマーカーオブジェクトを作成できます。

public static Object Dummy = new Object();

Objectの代わりに、おそらく有効な値と同じクラスを使用する必要があります。これで、VMをリセットすると、値が実際に変更され、WPFがその違いに気付くようになります。

于 2012-05-07T22:28:23.383 に答える
0

これを行うための単純で検証フレームワークに依存しない方法は、VMに作業を任せることです。

例えば

public class MyVM : MyBaseVM
{
    private ObservableCollection<Object> _items
        = new ObservableCollection<Object>();
    public ObservableCollection<Object> Items
    {
        get
        {
            return _items;
        }
    }

    private string _text;
    public string Text
    {
        get
        {
            return _text;
        }
        set
        {
            _text = value;
            Validate();

            if (_isValid)
                _model.Text = value;

            NotifyPropertyChanged("Text");
        }
    }

    private bool _isValid = true;
    public bool IsValid
    {
        get
        {
            return _isValid;
        }
        private set
        {
            _isValid = value;
            NotifyPropertyChanged("IsValid");
        }
    }

    private void Validate()
    {
        IsValid = _items.Any(i =>
            i.ToString().ToLower() == _text.ToLower().Trim());
    }
}
于 2012-05-06T16:59:46.860 に答える