Привязка цвета к данным в WPF DataTemplate

#c# #wpf #xaml #data-binding #datatemplate

#c# #wpf #xaml #привязка данных #datatemplate

Вопрос:

Это уже некоторое время не дает мне покоя, и, похоже, я не могу заставить его работать. Я использую шаблон данных для форматирования элементов в элементе управления ListBox, например:

 <ListBox HorizontalAlignment="Stretch" Name="listBox1" VerticalAlignment="Stretch" Grid.ColumnSpan="3" Grid.Row="1">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="30" />
                    <ColumnDefinition Width="30" />
                    <ColumnDefinition Width="100*" />
                </Grid.ColumnDefinitions>
                <Rectangle Width="30" Height="10" Grid.Column="0" 
                    VerticalAlignment="Stretch" 
                    HorizontalAlignment="Stretch" 
                    Fill="{Binding Path=Color, 
                        Converter={StaticResource SolidColorBrushConverter}, 
                        Mode=OneWay}" />
                <CheckBox Grid.Column="1" 
                    VerticalAlignment="Center" 
                    HorizontalAlignment="Center" 
                    IsChecked="{Binding Path=Selected}" />
                <Label Grid.Column="2" VerticalAlignment="Center" 
                    Content="{Binding Path=Name}" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
  

Проблема в том, что прямоугольник не отображается с привязанным цветом, как это должно быть. При отслеживании конвертера привязка, похоже, правильно получает цвет из связанного элемента (другие привязки к флажку и метке работают должным образом). Также я не получаю ошибок привязки в выводе отладки.

Я также попытался обернуть прямоугольник в <border> элемент с черной рамкой, который отображается правильно, поэтому я знаю, что прямоугольник, по крайней мере, отображается, однако замена BorderBrush атрибута на ту же привязку из атрибута прямоугольника Fill , как показано выше, приводит к исчезновению границы (опять же, без ошибок привязки).).

Как правильно добиться привязки цвета в WPF?

Комментарии:

1. Я предполагаю SolidColorBrushConverter , что уже преобразует входное значение в правильный Brush экземпляр?

Ответ №1:

В этом коде нет ничего плохого, ошибка должна быть в преобразователе. Возможно, он получает цвет, но устанавливает альфа-канал равным 0, делая все цвета полностью прозрачными. Если это не так, вам следует опубликовать код конвертера, чтобы люди могли взглянуть на него.

Также вы можете легко обойтись без каких-либо конвертеров:

 <Rectangle.Fill>
    <SolidColorBrush Color="{Binding Color}"/>
</Rectangle.Fill>
  

Комментарии:

1. Изначально я пытался сделать это, как вы сказали, без конвертеров, но конвертер, по крайней мере, позволил мне просмотреть передаваемые значения. Проблема заключалась в непрозрачности. Спасибо!