2014-03-19 43 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

夠公平的。根據我的編輯,我找到了一個更簡單的方法來解決我的問題,但是對於想要更新而不是刪除項目的實例,您的建議很有意義,所以我會接受您的答案。 –