3

我在 xaml 中为我的窗口创建了一个样式,其中包含对 DynamicResource 的绑定:

<Window.Resources>
    <local:RowColorConverter x:Key="RowColorConverter" />
        <Style x:Key="OddEvenRowStyle">
            <Setter Property="DataGridRow.Background">
                <Setter.Value>
                    <Binding RelativeSource="{RelativeSource AncestorType=GroupItem}" Path="(ItemsControl.AlternationIndex)" Converter="{StaticResource RowColorConverter}">
                        <Binding.ConverterParameter>
                            <x:Array Type="Brush">
                                <SolidColorBrush Color="{DynamicResource RowPrimaryBrush}" />
                                <SolidColorBrush Color="{DynamicResource RowSecondaryBrush}" />
                            </x:Array>
                        </Binding.ConverterParameter>
                    </Binding>
                </Setter.Value>
            </Setter>
        </Style>
</Window.Resources>

然后,我将样式分配给 DataGrid 的 RowStyle:

<DataGrid Name="dataGrid" AutoGenerateColumns="False" Height="Auto" Width="Auto" ItemsSource="{Binding}" RowStyle="{StaticResource OddEvenRowStyle}">

在我的窗口的初始化中,我分配了这些 DynamicResource 值:

Resources["RowPrimaryBrush"] = Colors.LightGray;
Resources["RowSecondaryBrush"] = Colors.DarkGray;

但是,当我加载窗口时,颜色无法正常工作:

在此处输入图像描述

我很确定我的其余代码没问题,因为当我将 xaml 中的颜色值更改为颜色值时:

<x:Array Type="Brush">
    <SolidColorBrush Color="LightGray" />
    <SolidColorBrush Color="DarkGray" />
</x:Array>

颜色被正确分配:

在此处输入图像描述

这就是为什么我被引导相信这与绑定有关。我绑定颜色的方式有问题吗?

4

3 回答 3

3

Binding.ConverterParameter不是 WPF 逻辑树的一部分,因此在其中执行动态资源查找将不起作用。

于 2012-06-25T15:34:56.030 回答
2

确保在窗口初始化之前设置资源。

public MainWindow()
{
    Resources["RowPrimaryBrush"] = Colors.LightGray;
    Resources["RowSecondaryBrush"] = Colors.DarkGray;
    InitializeComponent();
}

动态资源在更改时不会更新,例如绑定。它只是推迟到运行时而不是在编译时进行评估。


不熟悉限制,但这并不奇怪。您可能必须重写您的 RowColorConverter 以直接获取其参数,然后通过代码隐藏更新它

(Resources["RowColorConverter"] as RowColorConverter).Parameter = 
    new Brush[]
    {
        Brushes.LightGray, 
        Brushes.DarkGray
    }

或在您的 RowColorConverter 中定义附加属性

#region Brushes Attached DependencyProperty
public static readonly DependencyProperty BrushesProperty = DependencyProperty.RegisterAttached(
    BrushesPropertyName,
    typeof(SolidColorBrush[]),
    typeof(RowColorConverter),
    new FrameworkPropertyMetadata(null)
);
public const string BrushesPropertyName = "Brushes";
public static void SetBrushes(DependencyObject element, SolidColorBrush[] value)
{
    element.SetValue(BrushesProperty, value);
}
public static SolidColorBrush[] GetBrushes(DependencyObject element)
{
    return (SolidColorBrush[])element.GetValue(BrushesProperty);
}
#endregion

您可以在每个网格上进行不同的设置

<DataGrid Name="dataGrid" SnipPointlessAttributes="True">
    <local:RowColorConverter.Colors>
        <x:Array Type="Brush">
            <SolidColorBrush Color="LightGray" />
            <SolidColorBrush Color="DarkGray" />
        </x:Array>
    </local:RowColorConverter.Colors>
</DataGrid>
于 2012-06-25T14:52:43.867 回答
0

使用 MultiBinding 而不是带有转换器参数的绑定。

于 2015-01-09T16:51:50.833 回答