我正在尝试在WPF应用程序中实现某种“脏标志”,但遇到了一些问题。我有一个数据网格,并且其中一列允许用户编辑自定义Value
类的项的Device
属性。将来,该应用程序将链接到数据库,因此我希望用户能够使用我已经实现的保存按钮将更改保存到数据库。当用户未保存更改时,我希望该值的前景为红色。
我尝试使用MultiValueConverter
解决此问题,如this SO question所示,但是它没有按预期工作。这是包含我的转换器的类:
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[] ConvertBack(object value, System.Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
这是DataGrid的整个XAML。我不认为所有这些都与此问题有关,但是我不确定,因此最好将其包括在内:
<DataGrid Margin="20" AutoGenerateColumns="False" Name="MasterDataGrid" ScrollViewer.VerticalScrollBarVisibility="Visible" SelectionChanged="MasterDataGrid_SelectionChanged" AlternationCount="2" DockPanel.Dock="Top" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Header="Name" Binding="{Binding Name}"/>
<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>
<!-- This is probably the relevant bit -->
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Value, Mode=TwoWay,UpdateSourceTrigger=Explicit}">
<TextBlock.Background>
<MultiBinding Converter="{StaticResource MvcForeground}">
<Binding Path="Value"/>
<Binding Path="Value" Mode="OneTime"/>
</MultiBinding>
</TextBlock.Background>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- End Probably Relevant Bit -->
<DataGridTextColumn IsReadOnly="True" Header="Default Value" Binding="{Binding DefaultValue}"/>
<DataGridTextColumn IsReadOnly="True" Header="Minimum" Binding="{Binding Minimum}"/>
<DataGridTextColumn IsReadOnly="True" Header="Maximum" Binding="{Binding Maximum}"/>
</DataGrid.Columns>
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
根据我链接的问题,该解决方案应该可以正常工作,但是出于某种原因,只有unchanged
状态会注册(相反,当我尝试使用该方法时,前景和背景只是黑色,从不红色) 。
现在,我链接的答案将近9年了,我希望自那时以来WPF和C#会发生很大的变化。我不知道这些MultiValueConverters
的工作方式,所以我的第一个直觉是说问题出在传递给values
方法的Convert()
数组中,因为我不知道那是哪里叫。
但是,这仅仅是初学者的猜测。任何帮助是极大的赞赏。
P.S。是的,我确实在<Window.Resources>