2013-08-19 10 views
6

Próbuję utworzyć TypeConverter, który konwertuje mój niestandardowy typ na ICommand, jeśli wiążę go do polecenia przycisku.WPF nie wywołuje TypeConverter, gdy DependencyProperty jest interfejsem

Niestety pakiet WPF nie wywołuje mojego konwertera.

Przelicznik:

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}" /> 

Converter zostanie wywołany, jeśli będę wiązać się z treścią jak:

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

Wszelkie pomysły jak mogę uzyskać TypeConverter pracować ?

+3

Bardzo interesująca. Potwierdziłem, że problemem jest typ interfejsu będący interfejsem. Kod testowy: http://pastebin.com/EsMguMx5 - konwerter nigdy nie jest wywoływany, ale po prostu zmienia "IDestinationThing" na "DestinationThing" w definicji właściwości zależności i zacznie działać. – nmclean

Odpowiedz

3

Możesz to zrobić, jeśli utworzysz ITypeConverter. Ale będziesz musiał użyć go jawnie, więc jest więcej do napisania. Z drugiej strony, czasami jawność jest dobrą rzeczą. Jeśli próbujesz uniknąć konieczności deklarowania konwertera w Resources, możesz wyprowadzić z MarkupExtension. Więc konwerter będzie wyglądać następująco:

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

A potem by używać go jak:

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

Chciałbym uniknąć dodania konwertera. – baalazamon

+0

Cóż, zawsze możesz zaimplementować 'ICommand' (jawnie, jeśli nie chcesz, aby był odsłonięty). Jeśli WPF nie uruchomi twojego 'TypeConvertera' dla interfejsu, to są one tylko twoimi jedynymi opcjami. Ponadto, odpowiedź na to pytanie wydaje się opisywać, co się tutaj dzieje: http://stackoverflow.com/questions/17728436/why-are-icommand-properties-treated- szczególnie-przypomnienia –

+0

Rozumiem, że jest to spowodowane bzdurą impl z InterfaceConverter, miał nadzieję znaleźć jakieś obejście, które nie wymagałoby implementacji ICommand lub korzystania z konwertera. Właśnie teraz konwertuję obiekt ręcznie przed związaniem. – baalazamon

Powiązane problemy