2012-03-06 126 views
0

我在VB WPF應用程序中有一個可編輯的數據網格。 DataGrid本身的SourceUpdated屬性設置爲我的事件處理程序。網格中的2列是可編輯的,並且其綁定中的NotifyOnSourceUpdated標誌設置爲True。該事件正在正確觸發,但似乎無法找出確定發生了什麼變化的最佳方法。這兩列相互依賴,其中一個是物品數量,另一個是數量。如果用戶更改其中一個我想重新計算其他值並更新網格以及綁定源。我確信有很多方法可以解決這個問題,但我很好奇最好的方法。我可以監聽datagrid上的更改事件,查看更改內容,設置一些變量,然後使用SourceUpdated事件中的那些變量,但這看起來並不精美。有什麼建議麼?捕獲可編輯數據網格中更改的單元格

+0

要求「最好」的方式導致主觀答案,並且在S.O.中一般不鼓勵。但我對你的問題的措辭感到困惑:你在尋找一種方法來確定哪個細胞觸發了變化事件? – kmote 2012-03-06 23:20:45

+0

瞭解「最好」的擔憂......我的不好。但是,基本上,這就是我所要求的,但我認爲AngelWPF的答案將會滿足我的需求。我的datagrid綁定到一個ObservableCollection,但我仍然對這個東西不熟悉,並沒有考慮PropertyChanged事件。我會嘗試一下,看看它是如何發展的 – BrianVPS 2012-03-07 15:21:45

回答

1

我建議你走出事件處理程序的世界! WPF不鼓勵採用舊的WinForms方法來處理事件處理程序中的所有事情。

MVVM方式....

你必須利用你的模型類的功率在MVVM方式。綁定到數據網格的集合必須是一些項目的集合。如果你的數據網格顯示的是Employees的列表,那麼你的收藏必須是一些IEnumerable<Employee> ...所以Employee類可以幫助你在這裏。

假設您的數據網格顯示爲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. 

E.g.

  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"); 
      } 
     } 
    } 

哪裏OnPropertyChanged()是...

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

這樣你的圖形用戶界面將自動執行相關領域的轉換。

的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 2012-03-12 16:08:57

相關問題