2010-08-23 4 views
3

У меня есть привязка к неизвестному источнику. Все, что у меня есть, является обязательным. У меня нет другого способа взглянуть на связанный объект. Мне нужно выяснить Тип для связанного объекта, даже если значение равно null (это моя проблема).Могу ли я получить Type() связанного объекта в C#/WPF (даже если значение bound равно null)?

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

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

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

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

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

ответ

3

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

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

+0

Wow ... Yep , вот и все. Я не собираюсь этого делать. Похоже, я разрешу привязать свойство к свойству, установив вместо него строку «Property» и «Source». Спасибо хоть!:) – Phobis

+0

+1, хотя вам не нужно прыгать через обручи, чтобы получить «BindingExpression» - просто используйте «BindingOperations.GetBindingExpression». Однако отсюда вам, к сожалению, придется прибегнуть к размышлениям, чтобы определить тип свойства источника. –

0

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

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

У меня нет DataContext. В рамках моего оценочного кода у меня есть привязка. Я должен получить тип объекта, на который указывает привязка (даже если значение равно null) – Phobis

0

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

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

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

+0

Я привязываюсь к свойству объекта. Я просто пытаюсь найти способ доступа к PropertyInfo связанного свойства (или что-то подобное). – Phobis

+0

@Phobis: Я не думал, что вы привязываетесь к свойству не-объекта, это просто вопрос о том, как вы отследите этот объект. Отслеживание его из xaml, а затем отражение типа для его свойств может быть выполнимым, но если привязка определена в коде, но у вас может не быть никакого способа сделать это иначе, чем отражение, которое является декомпиляцией границы. –

Смежные вопросы