2013-08-19 30 views
6

Tôi đang cố gắng tạo TypeConverter sẽ chuyển đổi loại tùy chỉnh của tôi thành ICommand nếu tôi ràng buộc nó với Button Command.WPF không gọi TypeConverter khi DependencyProperty là giao diện

WPF không may là không gọi công cụ chuyển đổi của tôi.

Chuyển đổi:

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

Chuyển đổi sẽ được gọi nếu tôi sẽ liên kết với nội dung như:

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

Bất kỳ ý tưởng làm thế nào tôi có thể nhận được TypeConverter làm việc ?

+3

Rất thú vị. Tôi đã xác nhận rằng loại giao diện là một vấn đề. Mã thử nghiệm: http://pastebin.com/EsMguMx5 - trình biến đổi không bao giờ được gọi, nhưng chỉ cần thay đổi 'IDestinationThing' thành' DestinationThing' trong định nghĩa thuộc tính phụ thuộc và nó sẽ bắt đầu hoạt động. – nmclean

Trả lời

3

Bạn có thể làm điều đó nếu bạn tạo một ITypeConverter. Nhưng bạn sẽ phải sử dụng nó một cách rõ ràng, vì vậy nó là nhiều xaml để viết. Mặt khác, đôi khi được rõ ràng là một điều tốt. Nếu bạn đang cố gắng tránh phải khai báo bộ chuyển đổi trong Resources, bạn có thể lấy được từ MarkupExtension. Vì vậy, chuyển đổi của bạn sẽ trông như thế này:

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

Và sau đó bạn muốn sử dụng nó như:

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

Tôi muốn tránh thêm trình chuyển đổi. – baalazamon

+0

Vâng, bạn luôn có thể triển khai 'ICommand' (rõ ràng nếu bạn không muốn nó bị lộ). Nếu WPF không chạy 'TypeConverter' của bạn cho một giao diện, thì đó là những lựa chọn duy nhất của bạn. Ngoài ra, câu trả lời cho câu hỏi này dường như mô tả những gì đang xảy ra ở đây: http://stackoverflow.com/questions/17728436/why-are-icommand-properties-treated-specially-by-bindings –

+0

Tôi hiểu rằng đó là do crappy impl của InterfaceConverter, đã hy vọng tìm thấy một số workaround mà sẽ không yêu cầu thực hiện ICommand hoặc sử dụng chuyển đổi. Ngay bây giờ tôi đang chuyển đổi đối tượng bằng tay trước khi ràng buộc. – baalazamon

Các vấn đề liên quan