У меня есть пользовательский класс, "FavoriteColor", который имеет три свойства, R, G и B. Теперь я хочу потянуть прямоугольник и заполнить его этими R, G и значениями B (использующий связывающий с данными). Я попробовал следующий отрывок в своем xaml, но даю мне ошибку времени компиляции.
<Rectangle Width="10" Height="10" Grid.Column="4">
<Rectangle.Fill>
<SolidColorBrush>
<SolidColorBrush.Color>
<Color R="{Binding Path=R}" />
<Color G="{Binding Path=G}" />
<Color B="{Binding Path=B}" />
</SolidColorBrush.Color>
</SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
Это говорит, что свойства R, G и B Цветного класса не являются свойствами зависимости. Я знаю, что можно связать данные только со свойствами зависимости, но в этом случае, как я связываю свой R, G и B с цветом заливки прямоугольника.
Есть ли какой-либо другой путь кроме путем объявления еще одного свойства цвета шрифта и затем инициализации его, когда R, G и B установлены? Также, почему R, G и B цветного класса не являются свойствами зависимости?
Сделаем это с помощью MultiBinding и IMultiValueConverter. Вот полный пример.
Во-первых, xaml для Window1. Установим три ползунка и привяжем их значения к свойству Window's Background с помощью SolidColorBrush.
<Window x:Class="WpfApplication16.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:WpfApplication16"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<my:RgbConverter x:Key="RgbConverter" />
</Window.Resources>
<Window.Background>
<SolidColorBrush>
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource RgbConverter}">
<Binding Path="Value" ElementName="redSlider" />
<Binding Path="Value" ElementName="greenSlider" />
<Binding Path="Value" ElementName="blueSlider" />
</MultiBinding>
</SolidColorBrush.Color>
</SolidColorBrush>
</Window.Background>
<StackPanel>
<Slider Minimum="0" Maximum="255" x:Name="redSlider" />
<Slider Minimum="0" Maximum="255" x:Name="greenSlider" />
<Slider Minimum="0" Maximum="255" x:Name="blueSlider" />
</StackPanel>
</Window>
Далее, конвертер. Обратите внимание, что здесь я не делаю проверку на ошибки - действительно нужно проверить, что длина массива значений
равна 3, а отдельные значения - это действительные байты и т.д.
public class RgbConverter : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var r = System.Convert.ToByte(values[0]);
var g = System.Convert.ToByte(values[1]);
var b = System.Convert.ToByte(values[2]);
return Color.FromRgb(r, g, b);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Вот и все! Другого кода нет необходимости.