IMul​​tiValueConverter是什么导致Convert()被调用?

时间:2018-07-27 14:51:52

标签: c# wpf datagrid

我已经在WPF项目中尝试使用IMultiValueConverter接口,并且我注意到Convert方法在我不希望的地方被调用。例如:

我的项目中有一个DataGrid,其中有一个可编辑的DataGridTemplateColumn

<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.Style>
                                <Style TargetType="TextBlock">
                                    <Setter Property="Foreground">
                                        <Setter.Value>
                                            <MultiBinding Converter="{StaticResource MvcForeground}">
                                                <Binding Path="Value" />
                                                <Binding Path="OriginalValue" Mode="OneTime"/>
                                            </MultiBinding>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </TextBlock.Style>
                        </TextBlock>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

我有一个实现IMultiValueConverter接口的类:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;

namespace StupidTest
{
    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();
        }
    }

}

您可能已经知道了,但这是我的数据网格中用于“脏标志”的系统。当我更改该列中的值时,文本将变为红色,因为未保存。但是,当我按保存按钮时,值会更新,但颜色不会更新。在对此进行故障排除的过程中,我在Convert方法上设置了一些断点,我对所看到的感到非常困惑。

每当TextBox失去焦点并正确更新文本的颜色时,就会调用该方法。每当填充我的DataGrid时,它似乎也会调用,并且对每个项目都调用一次。

按保存按钮后,我不知道如何将颜色设置回黑色,因此我尝试将DataGridTemplateColumn更改为DataGridTextColumn,以实现此目的。但是,当我这样做时,Convert方法在完全不同的时间调用。现在,它将在应用程序启动后立即调用,而在我的DataGrid拥有项目源之前,即使我更改了列中的值,也不会再次调用它。

作为WPF的新手,我对此完全感到困惑。我以某种方式隐式调用了Convert,但是我不知道是什么触发了它。

TL; DR

该类的Convert方法似乎是在最奇怪的时候调用的,我认为我需要手动调用它,以便在按下按钮时重置脏标志。 那么究竟是什么导致该方法被调用,以及如何在我的代码中手动调用它?

此外,如果我要彻底解决此问题,请告诉我。我已经用尽了所有可以解决此问题的资源。感谢您提供的任何帮助。

0 个答案:

没有答案