Есть ли способ получить значение свойства объекта с помощью класса PropertyPath? - PullRequest
7 голосов
/ 18 мая 2009

Я хочу получить значение вложенного свойства объекта (что-то вроде Person.FullName.FirstName). Я видел, что в .Net есть класс с именем PropertyPath, который WPF использует для аналогичной цели в Binding. Есть ли способ повторно использовать механизм WPF, или я должен написать его самостоятельно.

Ответы [ 2 ]

13 голосов
/ 18 мая 2009

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

Как отмечает Эндрю, вы можете просто повторно использовать PropertyPath из WPF. Я предполагаю, что вы просто хотите оценить этот путь относительно объекта, который у вас есть, и в этом случае код немного вовлечен. Для оценки PropertyPath его следует использовать в привязке к объекту DependencyObject. Чтобы продемонстрировать это, я просто создал простой объект DependencyObject с именем BindingEvaluator, который имеет один объект DependencyProperty. Затем происходит настоящее волшебство, вызывая BindingOperations.SetBinding, который применяет привязку, чтобы мы могли прочитать оцененное значение.

var path = new PropertyPath("FullName.FirstName");

var binding = new Binding();
binding.Source = new Person { FullName = new FullName { FirstName = "David"}}; // Just an example object similar to your question
binding.Path = path;
binding.Mode = BindingMode.TwoWay;

var evaluator = new BindingEvaluator();
BindingOperations.SetBinding(evaluator, BindingEvaluator.TargetProperty, binding);
var value = evaluator.Target;
// value will now be set to "David"


public class BindingEvaluator : DependencyObject
{
    public static readonly DependencyProperty TargetProperty =
        DependencyProperty.Register(
            "Target", 
            typeof (object), 
            typeof (BindingEvaluator));

    public object Target
    {
        get { return GetValue(TargetProperty); }
        set { SetValue(TargetProperty, value); }
    }
}

Если вы хотите расширить это, вы можете подключить события PropertyChanged для поддержки чтения значений, которые изменяются. Надеюсь, это поможет!

0 голосов
/ 18 мая 2009

Я не вижу причин, по которым вы не могли бы его повторно использовать.

См. PropertyPath:

Реализует структуру данных для описание свойства как путь ниже другое имущество или ниже владения тип. Пути данных используются в данных привязка к объектам и в раскадровках и сроки анимации.

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