Привязка DynamicResource к цвету не работает

У меня есть стиль, созданный в 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>

Затем я назначаю стиль для RowStyle для DataGrid:

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

В инициализации моего окна я присваиваю следующие значения DynamicResource:

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

Однако, когда я загружаю окно, цвета не работают правильно:

Я почти уверен, что остальная часть моего кода в порядке, потому что когда я изменяю значения Color в xaml на значения цвета:

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

Цвета назначаются правильно:

Вот почему меня убеждают, что это связано с привязками. Что-то не так с тем, как я связываю свои цвета?

3 ответа

Решение

Убедитесь, что вы установили свои ресурсы до инициализации окна.

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

Динамический ресурс не будет обновляться при изменении, как Binding. Его просто откладывают до времени выполнения, а не оценивают во время компиляции.


Не знаком с ограничением, но это не удивительно. Возможно, вам придется переписать ваш RowColorConverter, чтобы получить его аргумент напрямую, а затем обновить его из codebehind через

(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>

Binding.ConverterParameter не является частью логического дерева WPF, поэтому выполнение динамического поиска ресурсов в нем не будет работать.

Используйте MultiBinding вместо привязки с параметром конвертера.

Другие вопросы по тегам