Привязка цвета фоновой ячейки к свойству класса byte[]

#c# #wpf #binding #multibinding

#c# #wpf #привязка #множественная привязка

Вопрос:

Я прочитал много сообщений о моей проблеме, кажется, что множественная привязка — лучшее решение, но я не могу заставить его работать.

Мне нужно привязать свойство класса, массив байтов, представляющий цвет aRGB, к цвету фоновой ячейки datagridcell.

Это мой класс :

 public class LedVals
{   ....
    public byte[] ColorT0 { get; set; } = new byte[4] { 0xFF, 0xFF, 0x00, 0x00 };
    ....
}
  

Для этого я использую пользовательский стиль :

     <Style TargetType="DataGridCell" x:Key="ColorPickerColorT0" 
       BasedOn="{StaticResource CommonCell}">
        <Setter Property="Background">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource RgbConverter}">
                    <Binding Path="ColorT0" />
                </MultiBinding>
            </Setter.Value>
        </Setter>
        <Setter Property="Foreground" Value="Transparent"/>
        <Setter Property="Width" Value="35"></Setter>
    </Style>
  

Это влияет на столбцы цвета :

     private void DgLedTable_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyName == "ColorT0")
        {
            e.Column.CellStyle = (sender as DataGrid).FindResource("ColorPickerColorT0") as Style;

        }
    }
  

Я думаю, что я что-то упускаю из виду в Multibinding…

Спасибо за вашу помощь.


Редактировать :

Это работает, благодаря совету Филиппа У.

Вот измененный стиль с помощью конвертера, не забудьте его объявить…

 <Window.Resources>
    <local:BytetoStringConverter x:Key="ColorConverter" />

----

    <Style TargetType="DataGridCell" x:Key="ColorPickerColorT0" 
       BasedOn="{StaticResource CommonCell}">
        <Setter Property="Background" Value="{Binding Path=ColorT0, Converter={StaticResource ColorConverter} }" />
        <Setter Property="Foreground" Value="Transparent"/>
        <Setter Property="Width" Value="35"></Setter>
    </Style>

----
</Window.Resources>
  

И преобразователь :

 public class BytetoStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        byte[] val = BitConverter.GetBytes((Int32)value);
        //val = (byte[]) value;
        return Color.FromArgb(val[3], val[2], val[1], val[0]).ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        byte[] val = new byte[4];
        Color c = (Color)value;
        val[0] = c.A;
        val[1] = c.R;
        val[2] = c.G;
        val[3] = c.B;

        return val;
    }
}
  

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

1. Вам нужна множественная привязка, только если вы привязываетесь к нескольким (!) свойствам. В вашем случае вам нужно только привязаться к ColorT0 , который является единственным свойством, поэтому вам нужен простой valueconverter (преобразуйте значение в byte[] и преобразуйте его в соответствующий цвет …)

2. хорошо, спасибо, ваше право, мне не нужна многозадачность… Я буду искать, как использовать value converter.