0

我需要做一些类似于 PriorityBinding 的事情,除了在绑定为 null 时使用较低优先级的绑定(而不是在绑定像 PriorityBinding 中那样无效时)。我似乎无法找到一种“好”的方法来做到这一点,除了创建两个重复的控件,每个控件都有我想要使用的每个绑定并根据绑定是否为空来触发它们的可见性。必须有更好的方法,因为我不想每次需要更改某些内容时都更新两个控件(重复代码 == 不好)。

例子:

当 SelectedItem.SelectedItem 不为空时:

<ContentControl Content="{Binding SelectedItem.SelectedItem}"/>

当 SelectedItem.SelectedItem 为空时:

<ContentControl Content="{Binding SelectedItem}"/>

使用这样的样式不起作用:

<ContentControl Content="{Binding SelectedItem.SelectedItem}">
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SelectedItem.SelectedItem}" Value="{x:Null}">
                    <Setter Property="Content" Value="{Binding SelectedItem}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

我猜这不起作用,因为样式中的绑定试图使用 ContentControl 的 Content 属性作为它们的源,因此 DataTrigger 正在测试SelectedItem.SelectedItem.SelectedItem.SelectedItem。有任何想法吗?

4

1 回答 1

4

您可以使用 MultiBinding 来实现您想要的:

<ContentControl Content="{Binding SelectedItem.SelectedItem}">
    <ContentControl.Content>
        <MultiBinding Converter="{StaticResource ResourceKey=myConverter}">
            <Binding Path="SelectedItem"/>
            <Binding Path="SelectedItem.SelectedItem"/>
        </MultiBinding>
    </ContentControl.Content>
</ContentControl>

您的转换器可能看起来像

public class MyMultiConverter:IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
   {
      if (values[1] == null)
          return values[0];

      return values[1];
   }

   public object[] ConvertBack(object values, Type[] targetType, object parameter, CultureInfo culture)
   {
      return null;
   }
}
于 2012-11-26T14:22:18.383 回答