【问题标题】:Change Border Color of DataGrid based on Property in ViewModel根据 ViewModel 中的属性更改 DataGrid 的边框颜色
【发布时间】:2015-07-01 02:19:52
【问题描述】:

我有一个 Combobox 和一个 DataGrid。我希望能够在组合框中选择一个值(SelectedItem 数据绑定到 ViewModel 的属性)。如果 DataGrid 中特定列的单元格值与组合框值匹配,我想更改整行的边框颜色。我找到了使用转换器更改 DataGrid 边框颜色的方法,但 ConverterParameter 不能绑定到 SelectedItem 属性,因为它不是 DependancyProperty 或 DependancyObject。关于我如何做到这一点的任何想法?谢谢!

【问题讨论】:

  • 为什么不使用 Javascript....特别是 Jquery?
  • 这是一个 WPF 桌面应用程序。
  • 对不起,我应该阅读标签
  • 没问题 - 无论如何谢谢!

标签: c# wpf mvvm datagrid


【解决方案1】:

在您的DataGridRow.StyleDataTriggers 中使用多值转换器的多重绑定:

Xaml:

<Window.Resources>
    <local:MultiConverter x:Key="multiConv"/>
</Window.Resources>
...

    <DataGrid ItemsSource="{Binding ViewModel.MyList}" >
        <DataGrid.RowStyle >
            <Style TargetType="{x:Type DataGridRow}">
                <Style.Triggers>
                    <DataTrigger Value="true">
                        <DataTrigger.Binding>
                            <MultiBinding Converter="{StaticResource multiConv}">
                                <Binding Path="ColorColumn" />
                                <Binding Path="ViewModel.SelectedColor" RelativeSource="{RelativeSource Mode=FindAncestor,
                                                AncestorType=Window}"/>
                            </MultiBinding>
                        </DataTrigger.Binding>
                        <Setter Property="BorderBrush" Value="Red" />
                        <Setter Property="BorderThickness" Value="1" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>
    <ComboBox ItemsSource="{Binding ViewModel.ColorList}" 
              SelectedItem="{Binding ViewModel.SelectedColor}"/>

多值转换器:

public class MultiConverter : IMultiValueConverter
{
    public object Convert(
        object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values[0] is MyColorType &&
            values[1] is MyColorType &&
            // if ComboBox.SelectedColor == CurrentDataGridRow.ColorColumn
            (MyColorType)values[0] == (MyColorType)values[1])
            return true;

        return false;
    }

    public object[] ConvertBack(
        object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

【讨论】:

  • 我在发布原始问题后也发现了这种方法。相反,我所做的是将一个 Brush 属性添加到 ViewModel 用于记录,并将 BorderBrush 的设置器的值数据绑定到这个新属性,这似乎是完成工作的更简单方法。不过,当我有一些额外的时间时,我可能会将其更改为这种方法。谢谢@Bahman_Aries !!
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2011-03-26
  • 2014-12-30
  • 1970-01-01
  • 2011-03-01
  • 2012-12-07
相关资源
最近更新 更多