2010-10-20 19 views
76

Bir tamsayı özelliğine bağlamaya çalışıyorum: ConverterParameter olarak bir tamsayı nasıl geçilir?

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

ve benim çeviricim:

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

Sorun şu ki dönüştürücüm çağrıldığında parametre dize. Tamsayı olmak için ihtiyacım var. Tabii ki dizeyi ayrıştırabilirim ama yapmak zorunda mıyım?

herhangi bir yardım için teşekkürler konstantin

+1

Windows Phone platformunda bunu bağlama konusunda biraz farklı sözdizimine sahip olduğumuzu bilen var mı? {Binding MADDİ Dönüştürücü = {StaticResource MYCONVERTER}, ConverterParameter = INT_VAL} INT_VAL –

cevap

83

İşte işte!

<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> 

hile temel sistem tipleri için ad dahil etmek ve sonra ConverterParameter elemanı şeklinde bağlayıcı, en azından yazma etmektir. Bütünlüğü sağlamak için

+2

Bu, 'IValueConverter.Convert() '' * * 'parametresi' * parametresinin' object' türünde olduğu gerçeğini değiştirmez. Hala çevirmek/ayrıştırmak zorundasınız ... –

+4

@djacobson - Doğru ama ValueConversion özniteliği belirtmenize izin veren budur. Bunun gerçekten derleme zamanı veya çalışma zamanı tarafından gerçekten kullanılıp kullanılmadığından emin değil. Özgün posterler sorusu açısından, "bir tamsayıya ihtiyacım var. Elbette dizeyi ayrıştırabilirim, ama yapmak zorunda mıyım?" Bu yüzden benim cevabım, bir dizgenin ayrıştırılması olmadığını, ancak ben hala daha güvenli olduğum bir tamsayıyı sadece bir kutudan çıkarmanın olduğunu açıklıyor. – jpierson

4

kullanmayın value.Equals için

teşekkürler. Kullanım:

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

Neden 'value.Equals' kullanmak istemediğiniz bir dize olarak geçirilecek bu örnekte ? – Zack

0

Bir şekilde XAML ConverterValue tür bilgileri ifade etmek güzel olurdu, ama şu an itibariyle mümkün olduğunu düşünmüyorum. Bu yüzden, bazı özel mantıklarla dönüştürücü nesnesini beklenen türünüze ayırmanız gerekir. Başka bir yol göremiyorum.

36

, (belki de daha az yazın) bir daha olası çözüm: (. Tabii ki, WindowUserControl ile ikame edilmiş olabilir, ve IntZero gerçek kullanım yerine yakın tanımlanabilir)

<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

Neden WPF milletinin neden MarkupExtension'u kullanma eğiliminde olmadığından emin değilsiniz. Burada bahsedilen sorun da dahil olmak üzere birçok sorun için mükemmel bir çözümdür. Bu biçimlendirme uzantısı 'm' XAML ad alanında mevcut değilse

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

ardından orijinal Yazarın örnek olur: biçimlendirme uzantısı ayrıştırıcı yapıcı argüman güçlü türünü görebilirsiniz çünkü

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

Bu işleri ve buna göre dönüştürürken, Binding's ConverterParameter argümanı ise (daha az bilgilendirici) Object-typed'dir.

+0

Benzer bir uzantıyı burada oluşturdum: http://stackoverflow.com/a/31993746/1254743 – Onur

+0

Teşekkürler, bu yararlı oldu. İlk XAML uzantım olacak. Ama bence her zaman “ProvideValue” içinde kutunun önüne geçmek için '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' yerine '' '' '' '' '' '' '' '' '' '' '' '' 'make'''nü yapmak daha iyidir. (Ve daha sonra, özel olarak yasadışı bir şey tahsis etmekten kaçınmak için "özel" yapın). – Zeus

+1

@Zeus Tipik olarak, 'ProvideValue' yalnızca işaretleme uzantısı örneği başına bir kez çağrılır, bu nedenle kutu yalnızca bir kez yapılmalıdır. Yapıcıda yapmamakla, ProvideValue’nın hiçbir zaman çağrılmaması durumunda tümüyle kutuluyorum. "Value" özelini yapmak için, bu, 'XAML' nesne elemanı sözdiziminde işaretleme uzantısını kullanmasını engeller: https://msdn.microsoft.com/en-us/library/ms788723(v=vs.100).aspx# object_element_syntax –

İlgili konular