jus*_*son 2 wpf xaml binding multibinding fallbackvalue
我有一个MultiBinding转换器,根据我的两个Binding字段是否评估为true来确定控件的可见性.如果由于某种原因它无法达到这些bool属性中的任何一个,我想将它们设置为true.例如:
我目前拥有的代码是:
<MultiBinding Converter="{StaticResource AndToVisibilityConverter1}" FallbackValue="Visible">
<Binding Path="IsConnected" FallbackValue="true" />
<Binding Path="CurrentUser.IsConsumerOnlyAgent" Converter="{StaticResource InvertedBooleanConverter1}" FallbackValue="True" />
</MultiBinding>
Run Code Online (Sandbox Code Playgroud)
代码运行正常,但我在IDE的输出中收到错误消息,指出:
System.Windows.Data Error: 11 : Fallback value 'True' (type 'String') cannot be converted for use in 'Visibility' (type 'Visibility'). BindingExpression:Path=IsConnected; DataItem=null; target element is 'StackPanel' (Name='');
Run Code Online (Sandbox Code Playgroud)
我已经确定了这个转换器并验证了它是XAML错误的位置.对于这里的无知感到抱歉,但有没有办法可以将FallbackValue设置为这些绑定中的每一个,以便在未能获得设置路径时评估为"true"?提前致谢
更新:
这是我的可见性转换器的代码(我在我的应用程序的几个地方使用它,只想添加回退值):
internal class AndToVisibilityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null)
return Visibility.Collapsed;
foreach (var value in values)
{
if (value == null || !(value is bool))
return Visibility.Collapsed;
if (!((bool) value))
return Visibility.Collapsed;
}
return Visibility.Visible;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
Met*_*urf 12
该FallbackValue值应该是Visibility回退到时绑定失败的价值:
<Binding Path="CurrentUser.IsConsumerOnlyAgent"
Converter="{StaticResource InvertedBooleanConverter1}"
FallbackValue="Visible" />
Run Code Online (Sandbox Code Playgroud)
编辑
fallbackValue
与目标属性相同类型的属性或对象元素值.请参阅该类型的XAML用法信息文档.该类型可能支持或不支持其值的属性语法,或者可能支持或不支持对象元素语法(这需要该类型的默认构造函数).因此,目标属性类型将影响您用于FallbackValue属性值的语法.
在这种情况下,MultiBinding的target属性是Visibility属性.尽管子MultiBinding属性的值期望bool,但父MultiBinding期望绑定的Visiblity值.这意味着每个MultiBinding属性的FallbackValue应具有Visibility属性的FallbackValue.
看起来有点违反直觉,但在考虑(IMO)时确实有意义,重新:如果MultiBindng上没有转换器,那么绑定的返回值应该是Visibility值.从等式中删除转换器,它可能有助于清理.
对于您的情况,跳过每个MultiBinding值的FallbackValue,并像现在一样在MultiBinding上设置FallbackValue.
<MultiBinding Converter="{StaticResource AndToVisibilityConverter1}" FallbackValue="Visible">
<Binding Path="IsConnected" />
<Binding Path="CurrentUser.IsConsumerOnlyAgent" Converter="{StaticResource InvertedBooleanConverter1}" />
</MultiBinding>
Run Code Online (Sandbox Code Playgroud)
经过一些测试后,似乎当 MultiBinding 中的“子绑定”失败(由于 UnsetValue 或无法找到绑定属性)时,子绑定的 FallbackValues 会传递到 MultiBinding 上的转换器中。
奇怪的是,子绑定上的 FallbackValue 类型需要与MultiBinding的目标匹配。我不理解这个要求,因为 MultiBinding 转换器可以从与该类型不匹配的绑定中获取值。
考虑到这一点,最简单的解决方法是修改 MultiBinding 的转换器以处理多种类型。在这种情况下,它需要处理布尔值和可见性。
即,我的转换函数如下所示:
public object Convert( object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture )
{
var bools = values.Where( b => b is bool ).Cast<bool>();
var vis = values.Where( v => v is Visibility ).Cast<Visibility>();
// if no usable values, return unset
if( vis.Count() + bools.Count() == 0 )
return DependencyProperty.UnsetValue;
// if true, return visible
if( bools.All( b => b ) && vis.All( v => v == Visibility.Visible ) )
return Visibility.Visible;
// if false, see if hidden or collapsed is specified
var param = parameter as string;
Visibility ret;
if( Enum.TryParse( param, out ret ) )
return ret;
// default to collapsed
return Visibility.Collapsed;
}
Run Code Online (Sandbox Code Playgroud)
此解决方法应通过将 Visible 指定为 true 并将其他内容指定为 false 来提供所请求的行为:
<MultiBinding Converter="{x:Static con:MultiAndToVisibilityConverter.Instance}">
<Binding Path="IsChecked" ElementName="CheckButton"/>
<Binding Path="RadioOne.IsChecked" FallbackValue="{x:Static Visibility.Visible}"
Converter="{x:Static con:BoolInverterConverter.Instance}"/>
</MultiBinding>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8176 次 |
| 最近记录: |