Nat*_*ium 44 wpf binding converter
我有一个我想显示/隐藏的控件,具体取决于布尔值.
我有一个NegatedBooleanConverter(切换为true,反之亦然),我需要先运行此转换器.我有一个BooleanToVisibilityConverter,我需要在NegatedBoolConverter之后运行这个转换器.
我该如何解决这个问题?我想在XAML中这样做.
编辑:这是一个可能的解决方案.
这似乎不起作用.它首先使用单独的转换器转换值,然后使用转换后的值执行某些操作.
我需要的是:
Nat*_*ium 60
这就是我做的:
public class CombiningConverter : IValueConverter
{
public IValueConverter Converter1 { get; set; }
public IValueConverter Converter2 { get; set; }
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
object convertedValue = Converter1.Convert(value, targetType, parameter, culture);
return Converter2.Convert(convertedValue, targetType, parameter, culture);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
<converters:CombiningConverter x:Key="negatedBoolToVisibilityConverter" Converter1="{StaticResource NegatedBooleanConverter}" Converter2="{StaticResource BoolToVisibilityConverter}" />
Run Code Online (Sandbox Code Playgroud)
我认为也可能是MultiValueConverter.也许我会稍后再试.
Jak*_*ger 28
扩展Natrium的伟大答案......
XAML
<conv:ConverterChain x:Key="convBoolToInverseToVisibility">
<conv:BoolToInverseConverter />
<BooleanToVisibilityConverter />
</conv:ConverterChain>
Run Code Online (Sandbox Code Playgroud)
类
/// <summary>Represents a chain of <see cref="IValueConverter"/>s to be executed in succession.</summary>
[ContentProperty("Converters")]
[ContentWrapper(typeof(ValueConverterCollection))]
public class ConverterChain : IValueConverter
{
private readonly ValueConverterCollection _converters= new ValueConverterCollection();
/// <summary>Gets the converters to execute.</summary>
public ValueConverterCollection Converters
{
get { return _converters; }
}
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Converters
.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Converters
.Reverse()
.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
}
#endregion
}
/// <summary>Represents a collection of <see cref="IValueConverter"/>s.</summary>
public sealed class ValueConverterCollection : Collection<IValueConverter> { }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您不需要转换器链。您只需要一个可配置的转换器。这类似于上面 Carlo 的回答,但明确定义了 true 和 false 值(这意味着您可以对Hidden、Visible或Collapsed转换使用相同的转换器)。
[ValueConversion(typeof(bool), typeof(Visibility))]
public class BoolToVisibilityConverter : IValueConverter
{
public Visibility TrueValue { get; set; }
public Visibility FalseValue { get; set; }
public BoolToVisibilityConverter()
{
// set defaults
FalseValue = Visibility.Hidden;
TrueValue = Visibility.Visible;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? TrueValue : FalseValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 XAML 中:
<BoolToVisibilityConverter x:Key="BoolToVisibleConverter"
FalseValue="Hidden"
TrueValue="Visible" />
Run Code Online (Sandbox Code Playgroud)
再次回答我自己的问题:我已经使用这个解决方案很多年了:
它使用 2 个现有转换器创建一个新转换器,首先调用第一个转换器,然后调用第二个转换器,依此类推。
我对这个解决方案非常满意。