Как разрешить связанный объект от bindingexpression с WPF?

include_once ('../../../ wp-config.php');

global $ wpdb;

$ password = wp_hash_password ("ваш пароль" ); [/ д2]

21
задан Andy 11 October 2009 в 17:11
поделиться

4 ответа

Ниже представлена ​​быстрая реализация метода расширения, который сделает именно то, что вы ищете. Я тоже не нашел ничего связанного с этим. Приведенный ниже метод всегда будет возвращать null, если по какой-либо причине значение не может быть найдено. Метод не будет работать, если путь включает []. Надеюсь, это поможет!

public static T GetValue<T>(this BindingExpression expression, object dataItem)            
{
    if (expression == null || dataItem == null)
    {
        return default(T);
    }

    string bindingPath = expression.ParentBinding.Path.Path;
    string[] properties = bindingPath.Split('.');

    object currentObject = dataItem;
    Type currentType = null;

    for (int i = 0; i < properties.Length; i++)
    {
        currentType = currentObject.GetType();                
        PropertyInfo property = currentType.GetProperty(properties[i]);
        if (property == null)
        {                    
            currentObject = null;
            break;
        }
        currentObject = property.GetValue(currentObject, null);
        if (currentObject == null)
        {
            break;
        }
    }

    return (T)currentObject;
}
24
ответ дан 29 November 2019 в 06:23
поделиться

Для людей в будущем, которые сталкиваются с этим вопросом:

Когда .NET 4.5 станет доступным, он будет иметь ряд новых свойств в BindingExpression, чтобы значительно упростить то, что вы ищете.

ResolvedSource - Объект, к которому на самом деле привязывается, полезно, когда у вас есть источник привязки, такой как 'grandparent.parent.me.Name'. Это вернет объект «я».

ResolvedSourcePropertyName - Имя свойства в ResolvedSource, к которому привязан. В случае выше, «Имя».

Аналогичным образом, будет Target и TargetName .

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

26
ответ дан Kevin Kalitowski 29 November 2019 в 06:23
поделиться

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

Скопированный блок кода для справки, прочитайте оригинальный пост для более подробной информации, предоставленной Томасом Левеском.

public static class PropertyPathHelper
{
    public static object GetValue(object obj, string propertyPath)
    {
        Binding binding = new Binding(propertyPath);
        binding.Mode = BindingMode.OneTime;
        binding.Source = obj;
        BindingOperations.SetBinding(_dummy, Dummy.ValueProperty, binding);
        return _dummy.GetValue(Dummy.ValueProperty);
    }

    private static readonly Dummy _dummy = new Dummy();

    private class Dummy : DependencyObject
    {
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(object), typeof(Dummy), new UIPropertyMetadata(null));
    }
}
8
ответ дан Community 29 November 2019 в 06:23
поделиться

Просто для дополнительной информации, PropertyPath разрешение обрабатывается внутренним классом MS под названием PropertyPathWorker, который живет в PresentationFramework под MS.Internal.Data. Если вы откроете его в Reflector, вы увидите, что он довольно сложный, поэтому я бы не рекомендовал пытаться дублировать его функциональность. Он тесно связан с общей архитектурой Binding.

Наиболее надежным способом поддержки синтаксиса всех путей свойств - включая свойства прикрепленных зависимостей и иерархический обход - является, вероятно, создание фиктивного зависимого объекта DependencyObject с зависимостями (DependencyProperty). Затем можно создать привязку из пути "владельца" к фиктивному свойству зависимостей, создать новое выражение BindingExpression, а затем вызвать выражение UpdateTarget. Это довольно тяжелый способ выполнения того, что, на первый взгляд, выглядит как простая задача, но я думаю, что есть много скрытых ловушек в том, как пути свойств разрешаются для привязки.

.
10
ответ дан 29 November 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: