我在我的窗口的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中的Color值更改为颜色值时:
<x:Array Type="Brush">
<SolidColorBrush Color="LightGray" />
<SolidColorBrush Color="DarkGray" />
</x:Array>
正确分配颜色:
这就是为什么我被引导相信它与绑定有关。我绑定颜色的方式有问题吗?
答案 0 :(得分:2)
确保在窗口初始化之前设置资源。
public MainWindow()
{
Resources["RowPrimaryBrush"] = Colors.LightGray;
Resources["RowSecondaryBrush"] = Colors.DarkGray;
InitializeComponent();
}
动态资源在更改时不会更新,例如Binding。它只是推迟到运行时而不是在编译时进行评估。
不熟悉限制,但这并不奇怪。您可能必须重写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>
答案 1 :(得分:2)
Binding.ConverterParameter
不是WPF逻辑树的一部分,因此在其中执行动态资源查找将无效。
答案 2 :(得分:0)
使用MultiBinding而不是与转换器参数绑定。