1

セル値が連続的に変化する WPF でデータグリッドを作成しましたが、セルの前の値に対してセルの背景色を変更することはできません。たとえば、セルの値が 10 から 20 に変化した場合セルの色が緑色になり、値が増加したことを示します。値が 5 になると、セルの背景色が赤色になり、値が減少したことを示します。datagridview の cellvaluechange イベントの winforms でそれを行いましたが、WPF では同じことができません。専門家の誰もがそれに関して何かをしました。

4

1 に答える 1

1

IsIncreasedセルにプロパティを作成して、増加/減少に従ってDataContexta を保持します。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 に答える