2013-08-19 19 views
6

Düğme Komutu'na bağlanırsam, özel türümü ICommand'a dönüştürecek olan TypeConverter oluşturmaya çalışıyorum.WPF Bağımlılık olmadığında TypeConverterProperty arabirim

Talihsiz WPF çeviricimi çağırmıyor.

Dönüştürücü:

public class CustomConverter : TypeConverter 
{ 
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     if (destinationType == typeof(ICommand)) 
     { 
      return true; 
     } 

     return base.CanConvertTo(context, destinationType); 
    } 

    public override object ConvertTo(
     ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     if (destinationType == typeof(ICommand)) 
     { 
      return new DelegateCommand<object>(x => { }); 
     } 

     return base.ConvertTo(context, culture, value, destinationType); 
    } 
} 

Xaml:

<Button Content="Execute" Command="{Binding CustomObject}" /> 
ben gibi içeriğe bağlamak eğer Dönüştürücü çağrılır

:

<Button Content="{Binding CustomObject}" /> 

işe TypeConverter nasıl alabilirim herhangi bir fikir ?

+3

Çok ilginç. Bir arayüzün türünün problem olduğunu doğruladım. Test kodu: http://pastebin.com/EsMguMx5 - dönüştürücü asla çağrılmaz, ancak bağımlılık özelliği tanımında 'İntestinationThing'' 'DestinationThing '' i değiştirir ve çalışmaya başlayacaktır. – nmclean

cevap

3

ITypeConverter'u oluşturursanız bunu yapabilirsiniz. Ancak bunu açıkça kullanmanız gerekecek, bu yüzden yazmak için daha fazla xaml. Öte yandan, bazen açık olmak iyi bir şeydir. Dönüştürücüyü Resources içinde bildirmekten kaçınmaya çalışıyorsanız, MarkupExtension'dan türetebilirsiniz.

public class ToCommand : MarkupExtension, IValueConverter 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 

    public object Convert(object value, 
          Type targetType, 
          object parameter, 
          CultureInfo culture) 
    { 
     if (targetType != tyepof(ICommand)) 
      return Binding.DoNothing; 

     return new DelegateCommand<object>(x => { }); 
    } 

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

Sonra hoşuna kullanmak istiyorum: Yani dönüştürücü şu şekilde görünecektir

<Button Content="Execute" 
     Command="{Binding CustomObject, Converter={lcl:ToCommand}}" /> 
+0

Dönüştürücü eklemekten kaçınmak istiyorum. – baalazamon

+0

Eh, her zaman ICommand'ı uygulayabilirsiniz (açıkta kalmasını istemiyorsanız açıkça). WPF bir arabirim için 'TypeConverter' çalıştırmazsa, bunlar sadece tek seçeneklerdir. Ayrıca, bu sorunun cevabı burada olup bitenleri açıklıyor gibi görünüyor: http://stackoverflow.com/questions/17728436/why-are-icommand-properties-treated-specially-by-bindings –

+0

Bunun nedeni InterfaceConverter'ın impl'si, ICommand'ı uygulamak veya dönüştürücü kullanmak istemeyecek bazı geçici çözümler bulmayı umuyordu. Şu anda, bağlamadan önce nesneyi el ile dönüştürüyorum. – baalazamon

İlgili konular