很抱歉,如果标题不太清楚,我不太确定如何写出更好的标题。
基本上,我正在尝试为我的项目中的DataGrid设置“脏标志”系统。当前,当我更改一个值时,文本变为红色,表明该值未保存。当我按下保存按钮时,文本应移回黑色,以指示更改已保存。这样做是可行的,但是只有在我再次单击该单元格之后,才迫使它更新状态。我想找到一种方法:
强制更新该列,以便文本更改颜色
在列中手动设置TextBlocks的颜色,而无需强制更新。
我认为两者都应该起作用,但是我不知道如何实现。
我最初使用的是Multi Value Converter来更改颜色,这是与Datagrid相关的XAML:
mapObj
这是转换器:
<DataGridTemplateColumn Header="Value">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<Grid FocusManager.FocusedElement="{Binding ElementName=textBox1}">
<TextBox Name="textBox1" GotFocus="TextBox_GotFocus" Margin="0" Padding="-2" MaxHeight="29" Text="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Value, Mode=TwoWay,UpdateSourceTrigger=Explicit}">
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource MvcForeground}">
<Binding Path="Value" />
<Binding Path="OriginalValue" Mode="OneTime"/>
</MultiBinding>
</TextBlock.Foreground>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我尝试添加一种方法来重置颜色,但这也不起作用。
这是我的“保存”按钮的代码:
public class MvcForeground : IMultiValueConverter
{
public object Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var changed = Brushes.Red;
var unchanged = Brushes.Black;
if (values.Count() == 2)
{
if (values[0].Equals(values[1]))
return unchanged;
else
return changed;
}
else
return unchanged;
}
public object Reset()
{
return Brushes.Black;
}
public object[] ConvertBack(object value, System.Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Changes have been saved to Database");
foreach (Device foo in MasterDataGrid.ItemsSource)
{
foo.Commit();
MasterDataGrid.Columns[1].CellStyle = (Style)XamlServices.Parse("<Style xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" TargetType=\"{x:Type DataGridCell}\"> <Setter Property=\"Foreground\" Value=\"Black\"></Setter></Style>");
}
}
方法仅保存值,它在其他地方实现。最下面的是我要解决的问题。它可能不是最漂亮的,但是应该更改行中所有单元格的前景色。当我在Commit()
中尝试时,它确实可以。我只能认为问题是因为我使用的是TextBlock来显示文本,而我拥有的代码仅更新了单元格样式,而不是TextBlock样式。但是,互联网上还没有多少精打细算的知识告诉我如何做与列内的TextBlocks类似的事情。
据我所知,我不能使用纯文本列,因为那样我就不能使用已有的单元格编辑机制。那个技工工作得很好,如果可以的话,我想保留它。
如果有人知道我的问题的解决方案,我将不胜感激。谢谢!