2013-06-13 2 views
2

행의 셀 값을 변경하면 동일한 행의 다른 셀을 동적으로 변경하려고합니다. 예를 들어, 다음 그리드, 때 내가 두 번째 행에서 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'에 표시되는 데이터를 저장하는 데 사용하는 코드를 표시하십시오. 그것은 어떤 종류의'List'입니까? –

답변

6

당신은 잘못된 접근 방식을 찍은 - 시도하고 SelectedCellsChanged 같은 사용자 인터페이스 이벤트에 대한 응답으로 일을 조작에 의존하지 않습니다.

대신 바인딩 된 데이터 개체의 바인딩 된 속성을 설정하는 관련 속성을 조작하고 업데이트 할 수 있습니다. 그런 다음 영향을받는 속성에 대한 속성 변경 알림을 발생하면 (자체 설정자에서 직접 수행해야 함) 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

관련 문제