【发布时间】:2011-04-02 17:59:01
【问题描述】:
为了减少多余的 XAML 标记,我尝试使用一般填充的单选按钮类型选择控件,即我使用 ItemsControl 枚举为 ItemsSource 并创建一个 DataTemplate 显示通过检查选择了哪个项目项的枚举值是否与当前设置相同。
仅此一项无法使用简单的转换器或 DataTrigger 完成,因为需要两个绑定,所以我创建了一个通用的 MutliValueConverter 来检查是否相等:
<CheckBox.Visibility>
<MultiBinding Converter="{StaticResource EqualityComparisonConv}">
<Binding Path="Key"/>
<Binding Path="DisplayMode_Current" Source="{x:Static local:App.Settings}"/>
</MultiBinding>
</CheckBox.Visibility>
public class EqualityComparisonConverter : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length < 2) throw new Exception("At least two inputs are needed for comparison");
bool output = (bool)values.Skip(1).Aggregate(values[0], (x1, x2) => { return x1.Equals(x2); });
return output;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
#endregion
}
这里明显的问题是转换器返回一个布尔值,我需要先将其转换为Visibility。
仅使用转换器将 MultiBinding 包装在另一个绑定中不起作用,因为这些属性不是依赖项属性(因此不能为它们分配绑定)。我可以想到一些解决方法,例如将 bool 存储在一些 Tag 属性中,因此我可以将其用作新的绑定源,但我会对这样的东西更感兴趣:
<CheckBox.Visibility>
<local:PipeConverter Converter="{StaticResource BooleanToVisibilityConv}">
<MultiBinding Converter="{StaticResource EqualityComparisonConv}">
<Binding Path="Key"/>
<Binding Path="DisplayMode_Current" Source="{x:Static local:App.Settings}"/>
</MultiBinding>
</local:PipeConverter>
</CheckBox.Visibility>
当原始绑定发生更改时,此类将需要更新其输出,并且它需要能够将其输出值公开给Visibility 属性,但我也不知道如何实现。遇到的一个问题是需要依赖属性,因此从 DependencyObject 继承会很好,但从 Binding 类继承也有意义,因为 PipeConverter 应该绑定并且需要设置为另一个依赖项的值属性。
【问题讨论】: