以下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);
}
Gateway是使用ServiceStack OrmLite Sqlite对Sqlite的简单调用。
思想?
答案 0 :(得分:1)
我会在视图模型上建议一个新属性,例如IsDirty
,然后你可以使用DataTrigger
来触发它,你当然必须使用右边自己更改属性DataGrid
个事件或内部变更通知。
答案 1 :(得分:0)
如果我是你,我会看一下设置UpdateSourceTrigger to Explicit然后在你想要将更改提交给viewmodel时触发UpdateSource方法。这样,您可以指定何时实际编辑属性。
我会玩这个看看IsEditing如何对应它。我以前从未真正使用过此UpdateSourceTrigger值,所以我不知道。它至少会控制属性更新的方式。
否则,如果这不好,那么H.B.说是现场,这就是你应该这样做的方式。