我已经在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
方法似乎是在最奇怪的时候调用的,我认为我需要手动调用它,以便在按下按钮时重置脏标志。 那么究竟是什么导致该方法被调用,以及如何在我的代码中手动调用它?
此外,如果我要彻底解决此问题,请告诉我。我已经用尽了所有可以解决此问题的资源。感谢您提供的任何帮助。