MultiValueConverter работает со свойством Color, но не со свойством Background
У меня есть MultiValueConverter, возвращающий один из двух SolidColoBrush, переданных как элементы values [], в зависимости от того, что bool также передан как values [] elment.
Все элементы values [] являются DependencyProperty.
Проблема в том, что когда я связываю свойство Background с этими SolidColorBrush через этот MultiValueConverter, я получаю ошибку приведения.
Если я связываю свойство SolidColorBrush.Color с этими SolidColorBrush (что мне кажется ошибкой, если где-то нет неявного преобразования), все работает нормально во время выполнения, но дизайнер не показывает желаемый Фон, он всегда показывает фон, связанный с "ложное" значение моего DependencyProperty, даже если для свойства установлено значение true.
Код такой:
XAML - UserControl
<UserControl.Resources>
<local:State2BackgroundConverter x:Key="state2BackgroundConverter"/>
</UserControl.Resources>
<Grid.Background>
<SolidColorBrush>
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource state2BackgroundConverter}">
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}" Path="Status"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}" Path="BrushOFF"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}" Path="BrushON"/>
</MultiBinding>
</SolidColorBrush.Color>
</SolidColorBrush>
</Grid.Background> // <--- This works at runtime but not at design time
<Grid.Background>
<MultiBinding Converter="{StaticResource state2BackgroundConverter}">
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}" Path="Status"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}" Path="BrushOFF"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}" Path="BrushON"/>
</MultiBinding>
</Grid.Background> // <--- This generates a cast error
XAML - Окно
<LightControls:MyButton Margin="1,0,0,0" Height="80" HorizontalAlignment="Left" Width="80" BrushON="#FF7CFEFF" BrushOFF="#FF0096FF" Status="True"/>
C#
public class Status2ColorConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if ((bool)values[0] == true)
return ((SolidColorBrush)values[2]);
else
return ((SolidColorBrush)values[1]);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return (null);
}
}
private static readonly DependencyProperty StatusProperty =
DependencyProperty.Register("Status",
typeof(bool),
typeof(MyButton),
new PropertyMetadata(tre)
);
public bool Status
{
get { return (bool)this.GetValue(StatusProperty); }
set { this.SetValue(StatusProperty, value); }
}
private static readonly DependencyProperty BrushONProperty = DependencyProperty.Register("BrushON",
typeof(SolidColorBrush),
typeof(MyButton),
new PropertyMetadata(new SolidColorBrush(Colors.Cyan))
);
public SolidColorBrush BrushON
{
get { return (SolidColorBrush)this.GetValue(BrushONProperty); }
set { this.SetValue(BrushONProperty, value); }
}
private static readonly DependencyProperty BrushOFFProperty = DependencyProperty.Register("BrushOFF",
typeof(SolidColorBrush),
typeof(MyButton),
new PropertyMetadata(new SolidColorBrush(Colors.Black))
);
public SolidColorBrush BrushOFF
{
get { return (SolidColorBrush)this.GetValue(BrushOFFProperty); }
set { this.SetValue(BrushOFFProperty, value); }
}
Итак, мои вопросы:
- Почему я должен привязывать свойство SolidColorBrush.Color, даже если мой BrushON/BrushOFF возвращает SolidColorBrush, а не SolidColorBrush.Color?
- Как я могу заставить это работать во время разработки? (ПРИМЕЧАНИЕ: все остальные свойства зависимостей в моем проекте, включая те, которые имеют собственный ValueConverter, а не MultiValueConverter, прекрасно работают во время разработки, даже другие свойства фона)
Заранее спасибо!
1 ответ
Для тех, кто сталкивается с той же проблемой, я нашел ответ на пункт 2 моего вопроса. В отличие от того, что происходит с IValueConverter, IMultiValueConverter не может оценить свойство зависимости во время разработки, даже если оно имеет значение по умолчанию.
Вот ссылка, которая дала мне правильную идею:
В этой статье в качестве решения предлагается оператор "как", поскольку он очищает нулевые переменные.
Переменная, в которой хранится значение свойства зависимости в моем коде, не должна быть нулевой во время разработки (свойство зависимости имеет значение по умолчанию, фактически, когда то же свойство зависимости используется как значение IValueConverter, все работает нормально), поэтому правильная вещь - это чтобы предотвратить такое поведение конструктора, проверив, имеет ли значение [] значение NULL, и назначив возвращаемое значение по умолчанию в этом случае.
В качестве примера (может быть много более разумных способов получить тот же результат):
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string s = values[0] as string;
if (s==null)
{
return (SomeDefaultValue);
}
else
{
Actually do something
}
}