Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于编辑状态在XAML数据网格中设置行背景颜色_C#_Wpf_Xaml_Wpf Controls_Wpfdatagrid - Fatal编程技术网

C# 基于编辑状态在XAML数据网格中设置行背景颜色

C# 基于编辑状态在XAML数据网格中设置行背景颜色,c#,wpf,xaml,wpf-controls,wpfdatagrid,C#,Wpf,Xaml,Wpf Controls,Wpfdatagrid,在编辑行时,以下XAML可用于更改背景颜色: <DataGrid.RowStyle> <Style TargetType="DataGridRow" > <Setter Property="Background" Value="AntiqueWhite" /> <Style.Triggers> <Trigger Property="IsEditing" Va

在编辑行时,以下XAML可用于更改背景颜色:

  <DataGrid.RowStyle>
      <Style TargetType="DataGridRow" >
          <Setter Property="Background"  Value="AntiqueWhite" />
          <Style.Triggers>
              <Trigger Property="IsEditing" Value="true">
                  <Setter Property="Background" Value="red" />
              </Trigger>
          </Style.Triggers>
      </Style>
   </DataGrid.RowStyle>

但我也希望有以下行为:

  • 保存后更改回默认颜色
  • 如果取消编辑,请更改回默认颜色
有什么建议吗

更新:

更清楚一点——它的行为正如我所期望的那样——只是寻找一些不同的东西。它只在编辑行时更改背景颜色。当我离开该行(保存更改之前)时,背景颜色将恢复为默认颜色。我希望编辑背景色保留在每个编辑行上,直到保存更改。如果我在保存之前将数据更改回未更改的状态,我希望背景颜色重置回默认值

下面是更多的代码:

    <DataGrid EnableRowVirtualization="True" ItemsSource="{Binding CurrentTransactionList}" AutoGenerateColumns="false" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Margin="5" Name="TransactionTable" VerticalAlignment="Stretch" RowEditEnding="TransactionTable_RowEditEnding">
<DataGrid.RowStyle>
    <Style TargetType="DataGridRow" >
        <Setter Property="Background"  Value="AntiqueWhite" />
        <Style.Triggers>
            <Trigger Property="IsEditing" Value="true">
                <Setter Property="Background" Value="red" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
    <DataGridTextColumn Header="ID" Width="40" Binding="{Binding Id}" IsReadOnly="True" Foreground="Gray" />
    <DataGridTextColumn Header="Label" Width="250" Binding="{Binding Label}" />
    <DataGridComboBoxColumn Header="Stat" SelectedItemBinding="{Binding Stat}" ItemsSource="{Binding Source={StaticResource stats}}"  Width="125" />
    <DataGridTextColumn Header="Change" Binding="{Binding Change}" Width="75" />
</DataGrid.Columns>    

TransactionTable_RowEditEnding事件处理程序仅启用更新按钮

这是相关的ViewModel:

    private ObservableCollection<StatTransactionValue> currentTransactionList;
    public ObservableCollection<StatTransactionValue> CurrentTransactionList {
        get { return currentTransactionList; }
        set {
            if (value != currentTransactionList) {
                currentTransactionList = value;
                NotifyPropertyChanged("CurrentTransactionList");
            }
        }
    }

    public void SetCurrentTransactionList(long ItemId) {
        CurrentTransactionList = Gateway.GetTransactions(ItemId);
    }

    public void UpdateTransactions() {
        Gateway.UpdateTransactions(CurrentTransactionList);
    }
private observeCollection currentTransactionList;
公共可观测集合CurrentTransactionList{
获取{return currentTransactionList;}
设置{
如果(值!=currentTransactionList){
currentTransactionList=值;
NotifyPropertyChanged(“CurrentTransactionList”);
}
}
}
public void SetCurrentTransactionList(长项目ID){
CurrentTransactionList=Gateway.GetTransactions(ItemId);
}
public void UpdateTransactions(){
Gateway.UpdateTransactions(CurrentTransactionList);
}
网关是使用ServiceStack或MLite Sqlite对Sqlite的简单调用


想法?

我建议在视图模型上添加一个新属性,比如
IsDirty
,然后您可以使用
DataTrigger
触发该属性,当然,您必须自己使用正确的
DataGrid
事件或内部更改通知来更改属性。

如果我是您,我会查看设置,然后在您要将更改提交到viewmodel时触发该方法。通过这种方式,可以指定实际编辑属性的时间

我会仔细研究一下,看看iEdit是如何与之对应的。我以前从未真正使用过这个UpdateSourceTrigger值,所以我不知道。它至少可以很好地控制属性更新的方式


否则,如果这不好,那么H.B.所说的就是正确的,这就是你应该做的。

谢谢,我最终做了这件事——保留了一个编辑ID的集合。为编辑/更新行着色的逻辑对于触发器来说太复杂,因此需要在代码中完成。