2013-06-13 162 views
2

當我更改某行中任何單元格的值時,我想動態更改同一行中的其他單元格。例如,在下面的網格,當我在第二行中改變1至3中的5的值必須改變到3 (編輯按鈕只保存變化到數據庫中。)當更改其他單元格時更新DataGrid中的單元格

enter image description here

這裏是我的DataGrid的xaml代碼。我曾嘗試使用SelectedCellsChangedSelectionChanged事件,但我沒有成功。

<DataGrid x:Name="MyDataGrid" x:Uid="MyDataGrid" AutoGenerateColumns="False" 
    Height="226" HorizontalAlignment="Left" Margin="106,111,0,0" 
    VerticalAlignment="Top" Width="684" ColumnWidth="*" 
    AlternationCount="2" SelectionMode="Single" 
    SelectedCellsChanged="MyDataGrid_SelectedCellsChanged" 
    SelectionChanged="MyDataGrid_SelectionChanged" > 

    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=ProductName}" Header="Ürün Adı" /> 
     <DataGridTextColumn Binding="{Binding Path=StoreName}" Header="Şube Adı" /> 
     <DataGridTextColumn Binding="{Binding Path=Day1}" Header="Pazartesi" /> 
     <DataGridTextColumn Binding="{Binding Path=Day2}" Header="Salı" /> 
     <DataGridTextColumn Binding="{Binding Path=Day3}" Header="Çarşamba" /> 
     <DataGridTextColumn Binding="{Binding Path=Day4}" Header="Perşembe" /> 
     <DataGridTextColumn Binding="{Binding Path=Day5}" Header="Cuma" /> 
     <DataGridTextColumn Binding="{Binding Path=Day6}" Header="Cumartesi" /> 
     <DataGridTextColumn Binding="{Binding Path=Day7}" Header="Pazar" /> 
     <DataGridTemplateColumn Header="Edit Row"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button Content="Edit" Click="EditButton_Click" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
+0

顯示您用來存儲DataGrid中顯示的數據的代碼。它是某種「列表」? –

回答

6

您已經採取了錯誤的做法 - 不要試圖依靠響應像SelectedCellsChanged用戶界面事件操作的東西。

相反,您可以操縱和更新綁定數據對象上綁定屬性的setter中的相關屬性。如果您然後針對受影響的屬性(他們應該在自己的設置器中自行完成)觸發屬性更改通知,那麼DataGrid中的值將通過綁定自動更新。

例子:

這是人爲的,但它應該告訴你我是什麼意思。如果你的數據對象,網格中的每一行結合包含private backing members一堆屬性和數據對象實現INotifyPropertyChanged那麼你可以做這樣的事情:

public class MyDataClass : INotifyPropertyChanged 
{ 
    public int Day1 
    { 
     get { return _day1; } 
     set 
     { 
      _day1 = value; 
      UpdateProperties(); 
     } 
    } 

    public int Day2 
    { 
     get { return _day2; } 
     set 
     { 
      _day2 = value; 
      UpdateProperties(); 
     } 
    } 

    // etc, repeat for the next three 'Day' properties 

    private void UpdateProperties() 
    { 
     //adjust the private backing members for each property: 
     _day1 = someValue; 
     _day2 = someOtherValue; 

     OnPropertyChanged("Day1"); 
     OnPropertyChanged("Day2"); 
     //etc, notify for each property that you adjusted 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangeEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private int _day1, _day2, //etc... ; 
} 

當然,當你這樣做,你要在設置屬性時要非常小心 - 你不想陷入循環調用的情況,這會導致堆棧溢出。調整私人支持成員後,然後爲每個更新的屬性觸發PropertyChanged事件後,網格中的行應通過綁定自動更新。

+0

我該怎麼做?對不起,我是wpf的初學者。你能舉個例子嗎? – rockenpeace

+2

請閱讀[MVVM模式](http://www.codeproject.com/Articles/278901/MVVM-Pattern-Made-Simple)。它與WPF並駕齊驅。 –

+0

對不起,沒有幫助.. – rockenpeace

相關問題