【问题标题】:Binding a toggle button to an enum using a value converter使用值转换器将切换按钮绑定到枚举
【发布时间】:2016-03-09 18:10:25
【问题描述】:

我正在处理的一个项目定义了一个只有两个状态的枚举。我正在使用切换按钮来切换属性值。

使用我为将枚举绑定到一组单选按钮而编写的值转换器不起作用,因为由于Binding.DoNothing,它只会以一种方式更改值。

这是用于单选按钮的枚举到布尔转换器,它只在一个方向上改变值:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    return value.Equals(parameter);
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    return value.Equals(true) ? parameter : Binding.DoNothing;
}

作为一种解决方法,我专门针对我正在使用的枚举进行了修改,如下所示,在ConvertBack 方法中将Binding.DoNothing 替换为MyEnum.Off

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value.Equals(parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value.Equals(true) ? parameter : MyEnum.Off;
    }

是否有更好的方法来切换此枚举值返回以启用切换按钮将枚举切换到可跨不同枚举类型重用的关闭状态?

【问题讨论】:

  • 你考虑过ConvertBack(...)方法中的targetType吗?
  • @Silvermind 我不太确定这将如何工作,但应该是可能的。你有什么建议吗?

标签: c# wpf ivalueconverter


【解决方案1】:

没有任何类型/空/等检查的最简单的方法如下:

public object Convert(object value, Type targetType, object parameter,
                      System.Globalization.CultureInfo culture)
{
    return System.Convert.ToBoolean(value);
}
public object ConvertBack(object value, Type targetType, object parameter,
                          System.Globalization.CultureInfo culture)
{
    return Enum.ToObject(targetType, value);
}


System.Convert.ToBoolean 接受任何 value 类型而不抛出异常。

你也可以做一些额外的类型检查,比如if (targetType.IsEnum),但这取决于你。

根据 msdn:Enum.ToObject() 仅接受 SByte, Int16, Int32, Int64, Byte, UInt16, UInt32, or UInt64.,但我怀疑它在内部使用 System.Convert,因此也接受布尔值。

【讨论】:

  • 这很有效,布尔值确实是Enum.ToObject() 方法中的一个可接受值。
【解决方案2】:

如果您的枚举只有 2 个状态,那么仅使用布尔值不是更简单吗?然后你可以将它外部化为一个函数,根据它的当前值将布尔值切换为真/假

编辑: 在阅读了@Kevin 留下的评论后,我意识到我误解了原来的问题。希望下面的内容更符合您的要求。它将获取一个枚举 T 并遍历它,返回序列中每个下一个项目的int 索引,直到它到达末尾,它将再次返回第一个项目(0)。

    private int SwitchEnum<T>(Enum G)
    {                        
        int next = Convert.ToInt32(G) + 1;

        if (Enum.IsDefined(typeof(T), next))
        {
            return next;
        }
        else
        {
            return 0;
        }
    }

你可以这样调用这个函数:

    MyEnum a = new MyEnum(); //Assuming MyEnum is your enum
    a = (MyEnum)SwitchEnum<MyEnum>(a);

【讨论】:

  • 使用 bool 可以消除 UI 和 viewModel 属性之间的转换器的需要,但我仍然需要在 viewModel 中的某个点在 bool 和 Enum 之间进行转换,然后才能使用系统其余部分中的枚举,因此不会消除对转换器的需求,它只是移动它。
  • 啊。我误解了。请参阅编辑。
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 2014-04-25
  • 2023-03-20
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多