Привязать к методу в WPF?

Как вы привязываетесь к методу объектов в этом сценарии в WPF?

public class RootObject { public string Name { get; } public ObservableCollection GetChildren() {...} } public class ChildObject { public string Name { get; } } 

XAML:

           

Здесь я хочу привязать метод GetChildren к каждому RootObject этого дерева.

EDIT привязка к ObjectDataProvider , похоже, не работает, потому что я привязываюсь к списку элементов, а ObjectDataProvider нужен либо статический метод, либо создает собственный экземпляр и использует его.

Например, используя ответ Мэтта, я получаю:

Ошибка System.Windows.Data: 33: ObjectDataProvider не может создать объект; Тип = ‘RootObject’; Ошибка = ‘Неверные параметры для конструктора.’

Ошибка System.Windows.Data: 34: ObjectDataProvider: ошибка при попытке вызвать метод по типу; Метод = ‘GetChildren’; Тип = ‘RootObject’; Ошибка = ‘Указанный член не может быть вызван в цель.’ TargetException: «System.Reflection.TargetException: для нестатического метода требуется цель.

Другим подходом, который может работать для вас, является создание пользовательского IValueConverter который принимает имя метода в качестве параметра, так что он будет использоваться следующим образом:

 ItemsSource="{Binding Converter={StaticResource MethodToValueConverter}, ConverterParameter='GetChildren'}" 

Этот преобразователь найдет и вызовет метод с использованием отражения. Это требует, чтобы у метода не было никаких аргументов.

Вот пример такого источника конвертера:

 public sealed class MethodToValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var methodName = parameter as string; if (value==null || methodName==null) return value; var methodInfo = value.GetType().GetMethod(methodName, new Type[0]); if (methodInfo==null) return value; return methodInfo.Invoke(value, new object[0]); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotSupportedException("MethodToValueConverter can only be used for one way conversion."); } } 

И соответствующий единичный тест:

 [Test] public void Convert() { var converter = new MethodToValueConverter(); Assert.AreEqual("1234", converter.Convert(1234, typeof(string), "ToString", null)); Assert.AreEqual("ABCD", converter.Convert(" ABCD ", typeof(string), "Trim", null)); Assert.IsNull(converter.Convert(null, typeof(string), "ToString", null)); Assert.AreEqual("Pineapple", converter.Convert("Pineapple", typeof(string), "InvalidMethodName", null)); } 

Обратите внимание, что этот преобразователь не targetType параметр targetType .

Не уверен, насколько хорошо он будет работать в вашем сценарии, но вы можете использовать свойство MethodName в ObjectDataProvider, чтобы он вызывал конкретный метод (с конкретными параметрами, если вы обладаете свойством MethodParameters) для извлечения его данных.

Вот fragment, взятый непосредственно со страницы MSDN:

    0 Celsius    

Итак, это ObjectDataProvider, который вызывает метод «ConvertTemp» на экземпляре classа «TemperatureScale», передавая два параметра (0 и TempType.Celsius ).

Нужно ли привязываться к методу?

Можете ли вы привязать свойство, которое является методом getter?

 public ObservableCollection Children { get { return GetChildren(); } } 

Если вы не можете добавить свойство для вызова метода (или создать class-оболочку, который добавляет это свойство), единственным способом, которым я знаю, является использование ValueConverter.

ObjectDataProvider также имеет свойство ObjectInstance, которое можно использовать вместо ObjectType

Вы можете использовать System.ComponentModel для динамического определения свойств для типа (они не являются частью скомпилированных метаданных). Я использовал этот подход в WPF, чтобы включить привязку к типу, который сохранил его значения в полях, поскольку привязка к полям невозможна.

ICustomTypeDescriptor и TypeDescriptionProvider могут позволить вам достичь того, чего вы хотите. Согласно этой статье :

TypeDescriptionProvider позволяет вам написать отдельный class, который реализует ICustomTypeDescriptor а затем зарегистрировать этот class в качестве поставщика описаний для других типов.

Я сам не пробовал этот подход, но надеюсь, что это будет полезно в вашем случае.

Чтобы привязываться к методу объекта в вашем сценарии WPF, вы можете привязываться к свойству, которое возвращает делегат.

  • Связывание в WPF с элементом массива, заданным свойством
  • Как правильно привязать xml к WPF DataGrid?
  • Обход проблемы из-за отсутствия оператора 'nameof' в C # для безопасного хранения данных по типу?
  • Как я могу привязать данные строк к ListBox в WPF / WP7?
  • Общий class наблюдаемого словаря для DataBinding / WPF C #
  • Можно ли связать свойство Canvas's Children в XAML?
  • Какие подходы доступны для фиктивных данных времени разработки в WPF?
  • Есть ли способ определить, где объявляется / создается привязка WPF?
  • Заполнить Combobox из базы данных
  • WPF перед записью
  • Для чего нужен DataContext?
  • Давайте будем гением компьютера.