MultiValueConverter适用于Color属性,但不适用于Background属性



我有一个MultiValueConverter,它返回作为values[]元素传递的两个SolidColoBrash中的一个,这取决于作为values[]elment传递的bool。

所有values[]元素都是DependencyProperty。

问题是,当我通过这个MultiValueConverter将Background属性绑定到这些SolidColorBrush时,我会得到一个强制转换错误。

如果我将SolidColorBrush.Color属性绑定到这些SolidColorBrush(这对我来说似乎是一个错误,除非某个地方有隐式转换),运行时一切都很好,但设计器没有显示所需的背景,它总是显示与我的DependencyProperty的"false"值相关的背景,即使我将属性设置为true。

代码是这样的:

XAML-用户控制

<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); }
}

所以我的问题是:

  1. 为什么我必须绑定SolidColorBrush.Color属性,即使我的BrushON/BushOFF返回SolidColorBrush而不是SolidColorBrushe.Color
  2. 我如何在设计时让它发挥作用?(注意:我的项目中的所有其他依赖属性,包括那些具有自定义ValueConverter而不是MultiValueConverter的属性,在设计时工作得很好,甚至包括其他后台属性)

提前感谢!

对于那些遇到同样问题的人,我找到了问题第2点的答案。与IValueConverter不同的是,IMultiValueConverter无法在设计时评估依赖属性,即使它有默认值。

这是给我正确想法的链接:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/9b902711-2c45-49f9-9478-b36f1e842f0b/imultivalueconverter-error-crashing-visual-studio-at-design-time?forum=wpf

在本文中,"as"运算符被提议作为解决方案,因为它可以分解空变量。

在我的代码中存储依赖属性值的变量在设计时不应该为null(事实上,当使用相同的依赖属性作为IValueConverter值时,依赖属性有一个默认值,一切都很好),因此,正确的做法是通过检查values[]是否为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
}
}

相关内容

  • 没有找到相关文章

最新更新