1

リスト型のコンボボックスがあります。データコンテキストを介してバインドされた ItemsSource と ItemSelected があります。選択したアイテムが変更されている場合は、ユーザーのアクションを確認するポップアップ メッセージを表示します。「OK」をクリックすると、選択が変更されます。ただし、キャンセルをクリックすると、選択がキャンセルされ、前のアイテムが保持されます。以下は、コンボボックスの SelectedItem にバインドされているプロパティです。

Public SomeClass Sel
{
  get
  {
    return _sel;
  }
  set
  {
    if (_sel != value)
    {
      var sview = _sel;

      if (Compare())
      {
        _sel = value;

        if (Sel != null)
          IsDefault = Sel.IsDefault;
        OnPropertyChanged(() => Sel);
      }
      else
      {
        MessageBoxResult result = MessageBox.Show("Message.", "Owb Message", MessageBoxButton.OKCancel);
        if (result == MessageBoxResult.OK)
        {
          _sel = value;
          if (Sel != null)
            IsDefault = Sel.IsDefault;
          OnPropertyChanged(() => Sel);
        }
        else
        {
          Application.Current.Dispatcher.BeginInvoke(new Action(() =>
          {
            _sel = sview;
            OnPropertyChanged("Sel");
          }), DispatcherPriority.Send, null);
          return;
        }
      }
    }
  }
}

コンボ ボックスはポップ ウィンドウにあります。その場合、 Dispatcher オブジェクトは機能しますか?

4

3 に答える 3

1

選択した値保持されていると思いますが、ビューが正しく更新されません。

この記事をご覧ください: http://www.codeproject.com/Articles/407550/The-Perils-of-Canceling-WPF-ComboBox-Selection。基本的に、.Net 3.5 に存在していたいくつかの回避策は、.Net 4.0 では機能しなくなりました。

于 2013-01-02T17:58:15.787 に答える
0

今では魔法のように機能します!ディスパッチャーを呼び出す前に値を設定するのを忘れました。_sel = sview

于 2013-01-03T10:43:58.053 に答える
0

原則として、ビジュアル コントロールがビューモデルに漏れている場合は、降りたくない道を進んでいます。

ComboBox の OnChanged イベントをインターセプトしてメッセージ ボックスを起動する動作を作成します。ビヘイビアの使用に関するチュートリアルはこちら

これにより、すべての UI ロジックが UI に保持され、viewmodel がデータと検証を管理します。

于 2013-01-02T14:20:13.937 に答える