我有以下转换器
[ValueConversion(typeof(bool), typeof(Visibility))]
public sealed class BoolToVisibilityConverter : IValueConverter
{
public Visibility TrueValue { get; set; }
public Visibility FalseValue { get; set; }
public BoolToVisibilityConverter()
{
// set defaults
TrueValue = Visibility.Visible;
FalseValue = Visibility.Collapsed;
}
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (!(value is bool))
return null;
return (bool)value ? TrueValue : FalseValue;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (Equals(value, TrueValue))
return true;
if (Equals(value, FalseValue))
return false;
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
<conv:BoolConverter x:Key="enableStyleConvertor" TrueValue="Visible" FalseValue="Collapsed" />
Run Code Online (Sandbox Code Playgroud)
有没有办法使它更通用,即它可以返回任何类型的对象?
您只需将 TrueValue 和 FalseValue 设为 Object 类型即可。您可能需要更新 Equals 代码以查看对象是否也实现IComparable 。
[ValueConversion(typeof(bool), typeof(object))]
public sealed class MyConverter : IValueConverter
{
public object TrueValue { get; set; }
public object FalseValue { get; set; }
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (!(value is bool))
return null;
return (bool)value ? TrueValue : FalseValue;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (IsEqual(value, TrueValue))
return true;
if (IsEqual(value, FalseValue))
return false;
return null;
}
private static bool IsEqual(object x, object y) {
if (Equals(x, y))
return true;
IComparable c = x as IComparable;
if (c != null)
return (c.CompareTo(y) == 0);
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
要使用它,您现在需要显式定义这些值:
<local:MyConverter>
<local:MyConverter.TrueValue>
<Visibility>Visible</Visibility>
</local:MyConverter.TrueValue>
<local:MyConverter.FalseValue>
<Visibility>Collapsed</Visibility>
</local:MyConverter.FalseValue>
</local:MyConverter>
Run Code Online (Sandbox Code Playgroud)
编辑:
通用版本如下所示:
[ValueConversion(typeof(bool), typeof(object))]
public sealed class MyConverter<T> : IValueConverter {
public T TrueValue { get; set; }
public T FalseValue { get; set; }
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture) {
if (!(value is bool))
return null;
return (bool)value ? TrueValue : FalseValue;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture) {
if (IsEqual(value, TrueValue))
return true;
if (IsEqual(value, FalseValue))
return false;
return null;
}
private static bool IsEqual(object x, object y) {
if (Equals(x, y))
return true;
IComparable c = x as IComparable;
if (c != null)
return (c.CompareTo(y) == 0);
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
但这并不容易从 XAML 访问。XAML 2009 对泛型有一些额外的支持,但这主要是针对松散的 XAML 文件(即未编译)。