gpt4 book ai didi

wpf - 通用 bool 转换器

转载 作者:行者123 更新时间:2023-12-01 22:35:20 26 4
gpt4 key购买 nike

我有以下转换器

  [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;
}
}
<conv:BoolConverter x:Key="enableStyleConvertor" TrueValue="Visible" FalseValue="Collapsed" />

有没有办法让它更通用,即它可以返回任何类型的对象?

最佳答案

您只需将 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;
}
}

要使用它,您现在需要显式定义值:

<local:MyConverter>
<local:MyConverter.TrueValue>
<Visibility>Visible</Visibility>
</local:MyConverter.TrueValue>
<local:MyConverter.FalseValue>
<Visibility>Collapsed</Visibility>
</local:MyConverter.FalseValue>
</local:MyConverter>

编辑:

通用版本如下所示:

[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;
}
}

但这并不容易从 XAML 访问。 XAML 2009 有一些 additional support对于泛型,但这主要是针对 loose XAML files (即未编译)。

关于wpf - 通用 bool 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5623867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com