2012-03-06 47 views
0

私はVB WPFアプリケーションで編集可能なDataGridを持っています。 DataGrid自体のSourceUpdatedプロパティは、自分のイベントハンドラに設定されています。グリッド内の列の2つは編集可能であり、BindingのNotifyOnSourceUpdatedフラグがTrueに設定されています。このイベントは適切に発射されていますが、何が変わったのかを判断する最良の方法はわからないようです。 2つの列は、一方が項目数量であり、他方が大文字小文字数量であるという点で、互いに依存します。ユーザーがそれらのいずれかを変更した場合は、もう一方の値を再計算し、グリッドとバインディングソースを更新します。これを処理するにはいくつかの方法があると確信していますが、何が最良の方法であるか不思議です。私は、データグリッド上の変更イベントを聞くことができ、何が変更されたかを見て、いくつかの変数を設定してから、それらをSourceUpdatedイベントで使用することができます。助言がありますか?編集可能なデータグリッドでどのセルが変更されたのをキャッチ

+0

「最良の」方法を求めると主観的な答えが得られますが、一般的にS.O.では推奨されません。しかし、私はあなたの質問の文言に混乱しています:どのセルが変更イベントを引き起こしたかを判断する方法を探していますか? – kmote

+0

"最高の"懸念を理解...私の悪い。しかし、はい、基本的に、私が求めていたことですが、私はAngelWPFの答えが私の必要とすることをすると思います。私のDataGridはObservableCollectionにバインドされていますが、私はまだこのようなものには新しく、PropertyChangedイベントについては考えていません。私はそれを試して、それがどうなるかを見てみよう。 – BrianVPS

答えて

1

イベントハンドラーの世界から出てくることをお勧めします。 WPFは、イベントハンドラですべてを行う古いWinFormsアプローチを採用することを躊躇しています。

MVVM方法....

あなたはMVVMの方法であなたのモデルクラスのパワーを活用しなければなりません。あなたのDataGridへのバインドされたコレクションは、いくつかのアイテムのコレクションでなければなりません。あなたがDataGridにEmployeesのリストを表示している場合、あなたのコレクションはある程度IEnumerable<Employee>でなければなりません。だからEmployeeクラスがあなたを助けます。

データグリッドが、相互に関連する2つの編集可能な列としてGenderSaluationを示しているとします。だからあなたのEmployeeクラスは

1. `Employee` class must implement `INotifyPropertyChanged` interface. 
2. `Gender` and `Salutation` properties must raise the `PropertyChanged` event from their property setters. 
3. In the setter of `Gender` \ `Salutation` we must write the logic of changing the other field. 

例えば...それで物事以下が必要ですOnPropertyChanged()あなたのGUIが自動的に関連する分野の変換を実行します。この方法で...

public void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

ある

  private string _gender; 
    public string Gender 
    { 
     get 
     { 
      return _gender; 
     } 

     set 
     { 
      if (_gender != value) 
      { 
       _gender = value; 

       if (_gender == "Male") 
       { 
        Salutation = "Mr"; 
       } 
       else if (_gender == "Female" 
        && (Salutation == "Mr" || string.IsNullOrEmpty(Salutation))) 
       { 
        Salutation = "Ms"; 
       } 
       else if (string.IsNullOrEmpty(_gender)) 
       { 
        Salutation = string.Empty; 
       } 

       OnPropertyChanged("Gender"); 
      } 
     } 
    } 

    private string _salutation; 
    public string Salutation 
    { 
     get 
     { 
      return _salutation; 
     } 

     set 
     { 
      if (_salutation != value) 
      { 
       _salutation = value; 

       if (_salutation == "Mrs" || _salutation == "Ms") 
       { 
        Gender = "Female"; 
       } 
       else if (_salutation == "Mr") 
       { 
        Gender = "Male"; 
       } 
       else if (string.IsNullOrEmpty(_salutation)) 
       { 
        Gender = string.Empty; 
       } 

       OnPropertyChanged("Salutation"); 
      } 
     } 
    } 

。あなたのフィールドがモデルに保存されたが、表示目的のためにのみあることをされていない場合は

ValueConverterの道...

あなたが使用することができますValueConverter ....

public class GenderToSalutationConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert 
     (object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     var _gender = (string) value; 
     if (_gender == "Male") 
     { 
      return "Mr"; 
     } 
     else if (_gender == "Female") 
     { 
      return "Ms"; 
     } 

     return string.Empty; 
    } 

    public object ConvertBack 
      (object value, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     var _salutation = (string)value; 
     if (_salutation == "Mrs" || _salutation == "Ms") 
     { 
      return "Female"; 
     } 
     else if (_salutation == "Mr") 
     { 
      return "Male"; 
     } 

     return string.Empty; 
    } 

    #endregion 
} 

XAML

<UserControl.Resources> 
     <local:GenderToSalutationConverter x:Key="GenderToSalutationConverter"/> 
    </UserControl.Resources> 
    <tk:DataGrid ItemsSource="{Binding Employees}"> 
     <tk:DataGrid.Columns> 
      <tk:DataGridTextColumn 
         Header="Sex" 
         Binding="{Binding Gender, 
          Converter={StaticResource GenderToSalutationConverter}}"> 
      </tk:DataGridTextColumn> 
      <tk:DataGridTextColumn 
         Header="Title" 
         Binding="{Binding Salutation}"> 
      </tk:DataGridTextColumn> 
     </tk:DataGrid.Columns> 
    </tk:DataGrid> 

・ホープ、このことができますが...

+0

私はこの場所の大部分をすでに持っていた(つまり、私のコレクションはObservableCollectionであり、コレクション内のオブジェクトはINotifyPropertyChangedなどを実装していた)。私は、PropertyChangedイベントを発生させることについて、その部分を欠いていました。今はうまくいっています。ありがとう!! – BrianVPS

関連する問題