Могу ли я получить Type () связанного объекта в C # / WPF (даже если значение привязки равно нулю)? - PullRequest
3 голосов
/ 23 августа 2010

У меня есть привязка к неизвестному источнику. Все, что у меня есть, это привязка. У меня нет другого способа посмотреть на связанный объект. Мне нужно выяснить тип связанного объекта, даже если значение равно нулю (вот где моя проблема).

Я оценивал привязку путем привязки к объекту, а затем использовал объект как способ получить тип, но мне нужно знать тип, даже если значение равно нулю.

Например, у меня есть такой класс:

public class Customer{
  public string Name { get; set; }
  public int Age { get; set; }
}

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

Итак, у меня есть пользовательский элемент управления, который теперь имеет объект Binding, представляющий, например, {Binding Name}. Как я могу получить тип «связанного объекта» с помощью C #?

Ответы [ 3 ]

3 голосов
/ 23 августа 2010

Готовы ли вы использовать рефлексию, чтобы получить доступ к закрытым пользователям? Если так, я думаю, что Binding имеет внутренний метод с именем CreateBindingExpression, который возвращает BindingExpression, который имеет закрытый член с именем _listener внутреннего типа PropertyPathListener. У него есть внутреннее свойство под названием LeafType, которое, как я полагаю, является тем, что вы ищете.

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

0 голосов
/ 23 августа 2010

Если значение равно нулю, тип не может быть получен. Если привязка связана со статическим ресурсом, определенным в App.xaml, вам буквально придется проанализировать сам файл xaml, чтобы выяснить тип, если он определен в классе, вам придется отразить его, чтобы узнать тип.

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

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

0 голосов
/ 23 августа 2010

Это должно быть просто делом

MyCustomControl.DataContext != null ? MyCustomControl.GetType() : default(Type);
...