我有一个包含DataGrid
的WPF应用程序,它被绑定到C# DataTable
上。它有一个转换器,可以根据单元格内的值更改单元格的背景颜色。在正常使用下,一切都按预期工作,但当我从单独的线程更新DataTable的值时,显示的值发生了变化,但转换器没有被触发。
DataGrid:
<UserControl.Resources>
<utility:CellColorConverter x:Key="ColorConverter" />
<Style x:Key="BlueDataGridStyle" TargetType="{x:Type DataGrid}">
<Setter Property="CellStyle" Value="{DynamicResource BlueDataGridCellStyle}" />
</Style>
<Style x:Key="BlueDataGridCellStyle" TargetType="DataGridCell" >
<Setter Property="Background">
<Setter.Value>
<MultiBinding Converter="{StaticResource ColorConverter}">
<MultiBinding.Bindings>
<Binding RelativeSource="{RelativeSource Self}" />
<Binding Path="Row" />
</MultiBinding.Bindings>
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<DataGrid
Name="dgSimple"
AutoGenerateColumns="True"
ItemsSource="{Binding Grid}"
IsReadOnly="True"
CanUserResizeColumns="False"
CanUserResizeRows="False"
CanUserSortColumns="False"
CanUserReorderColumns="False"
Margin="6"
SelectedIndex="{Binding SelectedRow}"
CurrentColumn="{Binding SelectedColumn}"
Style="{StaticResource BlueDataGridStyle}"
HeadersVisibility="All"
RowHeaderWidth="32"
ColumnWidth="32">
</DataGrid>
转换器:
public class CellColorConverter : IMultiValueConverter
{
object IMultiValueConverter.Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values[0] is DataGridCell cell && values[1] is DataRow row)
{
try
{
string columnName = (string)cell.Column.Header;
int columnIndex = cell.Column.DisplayIndex;
if (columnIndex == 0)
{
cell.FontStyle = FontStyles.Italic;
cell.FontWeight = FontWeights.Bold;
cell.FontSize = 20;
return new SolidColorBrush(Colors.Yellow);
}
string content = row.Field<string>(columnName); // Header must be same as column name
if (content == "w")
{
return new SolidColorBrush(Colors.Blue);
}
if (content == "h")
{
return new SolidColorBrush(Colors.Red);
}
if (content == "m")
{
return new SolidColorBrush(Colors.LightGray);
}
if (content == "c" || content == "b" || content == "s" || content == "d" || content == "p")
{
return new SolidColorBrush(Colors.Gray);
}
}
catch (Exception e)
{
Debug.WriteLine(e);
return new SolidColorBrush(Colors.Black); // Error! An Exception was thrown
}
}
return new SolidColorBrush(Colors.Green); // Something else.
}
object[] IMultiValueConverter.ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
我尝试调用NotifyPropertyChanged事件,希望这会触发转换器,但没有成功。
1条答案
按热度按时间zour9fqk1#
我假设问题是您没有使用Dispatcher调用setter。我没有看到你在另一个线程下触发的代码,但我会添加这样的代码: