#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.