Привязка 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 вместо привязки с параметром конвертера.