2010-10-20 29 views
76

我試圖綁定到一個整數屬性:如何傳遞一個整數作爲ConverterParameter?

<RadioButton Content="None" 
      IsChecked="{Binding MyProperty, 
         Converter={StaticResource IntToBoolConverter}, 
         ConverterParameter=0}" /> 

,我的轉換是:

[ValueConversion(typeof(int), typeof(bool))] 
public class IntToBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type t, object parameter, CultureInfo culture) 
    { 
     return value.Equals(parameter); 
    } 

    public object ConvertBack(object value, Type t, object parameter, CultureInfo culture) 
    { 
     return value.Equals(false) ? DependencyProperty.UnsetValue : parameter; 
    } 
} 

的問題是,當我轉換器被稱爲參數字符串。我需要它是一個整數。當然,我可以解析字符串,但是我必須嗎?

感謝您的幫助 康斯坦丁

+1

有沒有人知道如何在Windows Phone平臺上實現這一點,我們的綁定語法略有不同? {Binding PROPERTY,Converter = {StaticResource MYCONVERTER},ConverterParameter = INT_VAL} 在這個例子中INT_VAL將作爲字符串傳遞 – 2013-11-11 20:56:22

回答

83

這裏你去!

<RadioButton Content="None" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <RadioButton.IsChecked> 
     <Binding Path="MyProperty" 
       Converter="{StaticResource IntToBoolConverter}"> 
      <Binding.ConverterParameter> 
       <sys:Int32>0</sys:Int32> 
      </Binding.ConverterParameter> 
     </Binding> 
    </RadioButton.IsChecked> 
</RadioButton> 

訣竅是包含基本系統類型的名稱空間,然後至少在元素窗體中寫入ConverterParameter綁定。

+2

這不會改變'IValueConverter.Convert()''*參數「*參數的類型是'object'的事實。您仍然必須施放/解析它... – 2011-08-02 16:11:14

+4

@djacobson - True,但ValueConversion屬性允許您指定。不完全確定這是否真的在編譯時或運行時被使用。根據最初的海報問題,他指出「我需要它是一個整數,當然我可以解析字符串,但是我必須嗎?」所以我的答案減輕了,因爲沒有解析字符串,而只是解開一個整數,我仍然更安全。 – jpierson 2011-08-04 16:20:58

4

不要使用value.Equals。用途:

Convert.ToInt32(value) == Convert.ToInt32(parameter) 
+5

爲什麼你不想使用'value.Equals'? – Zack 2014-08-18 16:47:01

0

這將是很好以某種方式表達對ConverterValue在XAML類型的信息,但我不認爲這是可能到現在爲止。所以我想你必須通過一些自定義邏輯來將Converter Object解析爲你期望的類型。我沒有看到另一種方式。

36

爲了完整性,多了一個可能的解決方案(可能以較少的打字):(。當然,Window可以與UserControl替換,並且IntZero可以定義更接近實際使用的地方)

<Window 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" ...> 
    <Window.Resources> 
     <sys:Int32 x:Key="IntZero">0</sys:Int32> 
    </Window.Resources> 

    <RadioButton Content="None" 
       IsChecked="{Binding MyProperty, 
            Converter={StaticResource IntToBoolConverter}, 
            ConverterParameter={StaticResource IntZero}}" /> 

24

不知道爲什麼WPF人傾向於不願意使用MarkupExtension。這是包括此處提到的問題在內的許多問題的完美解決方案。

public sealed class Int32Extension : MarkupExtension 
{ 
    public Int32Extension(int value) { this.Value = value; } 
    public int Value { get; set; } 
    public override Object ProvideValue(IServiceProvider sp) { return Value; } 
}; 

如果此標記擴展是XAML命名空間中的「m」可用,那麼樓主的例子就變成:

<RadioButton Content="None" 
      IsChecked="{Binding MyProperty, 
         Converter={StaticResource IntToBoolConverter}, 
         ConverterParameter={m:Int32 0}}" /> 

這工作,因爲標記擴展解析器可以看到強類型的構造函數參數並相應地進行轉換,而Binding的ConverterParameter參數是(較少信息)Object-typed。

+0

我在這裏創建了一個類似的擴展:http://stackoverflow.com/a/31993746/1254743 – Onur 2015-08-13 16:40:00

+0

謝謝,這很有用。這將是我的第一個XAML擴展。但我認爲最好將'Value'設置爲'object'而不是'int',以避免每次在'ProvideValue'中裝箱。 (然後,將其設爲「私人」以避免直接分配非法內容)。 – Zeus 2016-02-05 05:26:30

+1

@Zeus通常'ProvideValue'每個標記擴展實例只調用一次,所以拳擊應該只發生一次。通過不在構造函數中完成,如果'ProvideValue'永遠不會被調用,我就完全避免裝箱。至於使'Value'專用,這將阻止在'XAML'對象元素語法中使用標記擴展:https://msdn.microsoft.com/en-us/library/ms788723(v=vs.100).aspx# object_element_syntax – 2016-06-19 19:40:22

相關問題