2012-10-10 6 views
1

WPF에서 셀 값이 연속적으로 변경되는 DataGrid를 만들었지 만 이전 값과 비교하여 셀의 백채를 변경할 수는 없습니다 예 : 예를 들어 셀의 값이 10에서 20으로 변경되면 셀의 색이 녹색으로 변하여 값이 증가하고 값이 5가되면 셀 백 색이 빨간색으로 표시되어 값이 감소되었음을 나타냅니다 . 나는 winforms에서 datagridview의 cellvaluechange 이벤트를 수행했지만 WPF에서는 동일한 작업을 수행 할 수 없다. 전문가 중 누구라도 그 일에 관해 아무 것도하지 않았습니다.WPF DataGrid에서 이전 셀 값에 대해 DataGrid 셀 백채를 변경합니다.

답변

1

세포의 DataContextIsIncreased 속성을 생성하여 Nullable<bool>을 증가/감소로 유지합니다.

public class DatagridCellViewModel: INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void FirePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private bool _isIncreased 
    public bool? IsIncreased 
    { 
     get{ return _isIncreased; } 
     set{ 
      _isIncreased = value, 
      FirePropertyChanged("IsIncreased"); 
     } 
    } 

    //this is going to store the value you have in your table. Don't forget to bind it to the cells content 
    private int _dataValue; 
    public int DataValue 
    { 
     get{ return _dataValue; } 
     set{ 
      if(_dataValue != value) 
      { 
       IsIncreased = _dataValue < value 
       _dataValue= value; 

       FirePropertyChanged("DataValue"); 
      }    
     } 
    } 

    //other properties and methods 
} 

public class DataGridViewModel 
{ 

    private ICollection<DataGridRowViewModel> _myDgRows = new ObservableCollection<DataGridRowViewModel>(); 
    public ObservableCollection<DataGridRowViewModel> MyDgRows { get{ return _myDgRows;} 
} 

public class DataGridRowViewModel : INotifyPropertyChanged // don't forget to implement this interface 
{ 
    //put here fields and properties you want to display in a row in your datagrid 
    //that means as many fields as many columns you have 

    private DataGridCellViewModel _cellValue; 
    public int CellValue 
    { 
     get{ return _cellValue; } 
     set{ 
      if(!_cellValue.Equals(value)) 
      { 
       _cellValue= value; 

       FirePropertyChanged("CellValue"); 
      }    
     } 
    } 
} 

IsIncreased 값에 따른 셀의 배경을 설정하는 DataTrigger을 작성

<DataGrid ItemsSource="{Binding MyDgRows}" AutoGenerateColumns="False" > 
<DataGrid.Columns> 
    <DataGridTemplateColumn Header="ChangingValues" Width="SizeToCells"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <TextBox Name="ContentTbx" Text="{Binding CellValue.DataValue}" /> 
       <DataTemplate.Triggers> 
        <DataTrigger Binding="{Binding CellValue.IsIncreased}" Value="True"> 
        <Setter Property="Background" Value="Green" /> 
        </DataTrigger> 
       <DataTrigger Binding="{Binding CellValue.IsIncreased}" Value="False"> 
        <Setter TargetName="ContentTbx" Property="Background" Value="Red"/> 
       </DataTrigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
</DataGrid.Columns> 
</DataGrid> 

는 셀 데이터 소품 변경마다 소품 IsIncreased 설정

EDIT : 테이블을 바인딩하지 않지만 ObservableCollecition이 MyDgRows를 호출합니다. 이를 위해 DataGridViewModel 인스턴스가 DataGrids DataContext 여야합니다.

아마도 DataValue 소품에서 int-string 변환을 처리해야합니다. 그 문제에 대한

나는

가 첫 번째 링크는 this

datatriggers이

을 DataTemplate을 한 데이터 그리드

WPF

을 봤

두 번째 결과는 this

이며 거의 모든 문제를 다룹니다. 자급 자족하십시오

+0

도움 주셔서 감사합니다. 데이터 테이블로 DataGrid를 바인딩하는 경우 해당 작업을 알면됩니다. 또한 행사를 언제 어떻게해야합니까? datarow를 업데이트 할 때? 죄송 합니다만 "FirePropertyChanged"필드 스텁을 정교하게 작성하십시오. –

+0

PropertyChanged가 항상 null이되는 이유는 무엇입니까? 언제 내 코드에서이 속성을 변경해야합니까? 이 작은 것들을 묻는 것에 유감스럽게 생각하지만 처음으로하고 있습니다. 그런 식으로 도와주세요. –

+0

DatagridCellViewModel obj = new DatagridCellViewModel(); 을 DataRowView의 DR이 = (을 DataRowView) mygrid.Items [0]; dr [3] = newvalue; obj.DataValue = newvalue; mygrid.Items.Refresh(); 항상 IsIncreased 내가 참 또는 거짓, 그에 따라 datavalue를 업데이트하고 때 변경됩니다. 하지만 여전히 proprtychanged null을 받고 있는데, 나는 무엇인가 놓치고 있습니까? 제발 .. 도와주세요! –

관련 문제