2014-03-19 101 views
2

有一种情况,UI中的复选框需要绑定到数字参数 - 有效地,某些值使复选框为“true”,否则为“false”。WPF - ConverterParameter中的动态值

做到这一点最简单的方法似乎是使用转换器:

[ValueConversion(typeof(int), typeof(bool?))] 
public class TypeToBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (targetType != typeof(bool?)) 
      throw new InvalidOperationException("The target must be a bool"); 

     if((value < 3) 
     { 
      return true; 
     } 
     return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplmentedExpection(); 
    } 
} 

然后在XAML:

<CheckBox IsChecked="{Binding Path=Type.TypeID, Converter={StaticResource TypeConverter}}" /> 

使用转换时就像一个魅力哪些工作,但完全失败时使用ConvertBack是因为它需要知道数值是什么(它取决于其他UI元素),然后才能知道要返回的数字 - 它需要访问绑定的对象。

我认为我可以用ConverterParameter做到这一点,但从外观上看,您无法将值绑定到此属性。

有没有办法摆脱这个混乱?

编辑:我解决了这个混乱的原始绑定,并逃避了它,因为取消所有我想要做的是删除该项目无论如何。但是我会留下这个地方,因为这似乎是一个有效的问题,我对可能的解决方案感到好奇。

+0

这可以有任何帮助吗? http://stackoverflow.com/questions/397556/how-to-bind-radiobuttons-to-an-enum – Lucian

回答

5

为什么你不只是绑定到某些东西,并在你绑定的东西,例如一个viewmodel做工作?它可能会更干净更快。

转换器在理论上很好,但是在构建了很多大型的WPF项目之后,我几乎从不会像上面那样使用它们。当然,你可以让它做你想做的,但是有什么意义呢?您对这些转换发生的方式和时间的控制要少得多。

+0

好点,但在这种情况下,它会涉及显着的额外努力。它后面的ViewModel包含许多EF对象的集合,它们直接使用,没有映射。要做你的建议需要我添加一些POCO和AutoMapping,然后在POCO中添加所需的属性。 –

+0

好的。您也可以使用视图模型来修饰这些对象,并仅根据需要添加包装属性。国际海事组织,ValueConverters在现实世界中根本没有任何用处。 ViewModel将仅拥有EF对象并充当外观。转换器的另一个弱点是UI线程正在运行,这在实际的项目中又一次让它们变得不那么好。 – therewillbesnacks

+0

够公平的。根据我的编辑,我找到了一个更简单的方法来解决我的问题,但是对于想要更新而不是删除项目的实例,您的建议很有意义,所以我会接受您的答案。 –