2010-02-06 3 views
10

Я пишу настраиваемый элемент управления, и у меня есть путь свойства как строка (думаю, comboBox.SelectedValuePath).
Каков наилучший способ в коде для оценки этой строки для произвольного объекта?WPF Как мне оценить путь собственности?

Я, очевидно, могу просто разобрать его сам, но это взломать, и я хочу, чтобы путь поддерживал все, что comboBox.SelectedValuePath делает (для согласованности).

Результат (благодаря Aran Mulholland):

Не уверен, что о выполнении этого, но я все равно много для выполнения прямо сейчас.

public class BindingEvaluator { 
    #region Target Class 

    private class Target : DependencyObject { 
     public static readonly DependencyProperty ResultProperty = DependencyProperty.Register(
      "Result", typeof(IEnumerable), typeof(BindingEvaluator) 
     ); 

     public object Result { 
      get { return this.GetValue(ResultProperty); } 
      set { this.SetValue(ResultProperty, value); } 
     } 
    } 

    #endregion 

    public object GetValue(object source, string propertyPath) { 
     var target = new Target(); 
     BindingOperations.SetBinding(target, Target.ResultProperty, new Binding(propertyPath) { 
      Source = source, 
      Mode = BindingMode.OneTime 
     }); 
     return target.Result; 
    } 
} 
+0

Следует ли отметить, что объявленный тип свойства DependencyProperty в Target является IEnumerable, когда свойство Result имеет объект типа? – dtm

+0

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

+0

Я реализовал что-то вроде этого с соответствующими типами для свойства зависимости и самого свойства; однако, и, что удивительно, он все еще работает, если я заменю IEnumerable вместо Object in DepedencyProperty.Register. Не уверен, что делать с этим ... – dtm

ответ

6

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

+0

Спасибо, это работает, добавив результирующий код к вопросу. –

+1

Я использую его также в нечетном случае, я действительно задаюсь вопросом о производительности, но wpf использует привязку по всему месту, так что еще один ... –

+1

WPF может иметь кэширование на месте, а код в текущей форме - нет. По крайней мере, кэширование привязки между несколькими вызовами теоретически может быть лучше, но мне все равно, чтобы проверить, если я не замечу замедление. :) –

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