セル値が連続的に変化する WPF でデータグリッドを作成しましたが、セルの前の値に対してセルの背景色を変更することはできません。たとえば、セルの値が 10 から 20 に変化した場合セルの色が緑色になり、値が増加したことを示します。値が 5 になると、セルの背景色が赤色になり、値が減少したことを示します。datagridview の cellvaluechange イベントの winforms でそれを行いましたが、WPF では同じことができません。専門家の誰もがそれに関して何かをしました。
質問する
470 次
1 に答える
1
IsIncreased
セルにプロパティを作成して、増加/減少に従ってDataContext
a を保持します。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");
}
}
}
}
値DataTrigger
に従ってセルの背景を設定する を作成します。IsIncreased
<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>
セルの Data プロップが変更されるたびに IsIncreased プロップを設定します
EDIT :テーブルをバインドしませんが、ObservableCollecition は MyDgRows を呼び出します。このため、DataGridViewModel インスタンスは DataGrids DataContext である必要があります。
おそらく、DataValue プロップで int-string 変換を処理する必要があります。
それについては、私はググった
データグリッド wpf
最初のリンクはこれでした
と
データトリガーデータテンプレート
2番目の結果はこれでした
そして、それらは問題のほぼ全体をカバーしています。もっと自給自足しよう
于 2012-10-10T06:55:20.997 に答える