3

DynamicResource へのバインディングを含むウィンドウの xaml でスタイルを作成しています。

<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 値を color 値に変更すると、コードの残りの部分は問題ないと確信しています。

<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();
}

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>
于 2012-06-25T14:52:43.867 に答える
0

コンバーター パラメーターを使用したバインドの代わりに、MultiBinding を使用します。

于 2015-01-09T16:51:50.833 に答える