DataGridTemplateColumn是否在按下按钮时重置脏标志?

时间:2018-07-25 14:43:18

标签: c# wpf xaml wpfdatagrid

很抱歉,如果标题不太清楚,我不太确定如何写出更好的标题。

基本上,我正在尝试为我的项目中的DataGrid设置“脏标志”系统。当前,当我更改一个值时,文本变为红色,表明该值未保存。当我按下保存按钮时,文本应移回黑色,以指示更改已保存。这样做是可行的,但是只有在我再次单击该单元格之后,才迫使它更新状态。我想找到一种方法:

  1. 强制更新该列,以便文本更改颜色

  2. 在列中手动设置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类似的事情。

据我所知,我不能使用纯文本列,因为那样我就不能使用已有的单元格编辑机制。那个技工工作得很好,如果可以的话,我想保留它。

如果有人知道我的问题的解决方案,我将不胜感激。谢谢!

0 个答案:

没有答案