WPF - получение значения свойства из пути привязки - PullRequest
14 голосов
/ 26 августа 2010

если у меня есть объект скажем MyObject, который имеет свойство MyChild, которое само имеет свойство Name. Как я могу получить значение этого свойства Name, если все, что у меня есть, это путь привязки (то есть «MyChild.Name») и ссылка на MyObject?

MyObject
  -MyChild
    -Name

Ответы [ 4 ]

20 голосов
/ 27 августа 2010

Я нашел способ сделать это, но он довольно уродливый и, вероятно, не очень быстрый ... По сути, идея состоит в том, чтобы создать привязку с данным путем и применить ее к свойству объекта зависимости.Таким образом, привязка выполняет всю работу по извлечению значения:

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));
    }
}
3 голосов
/ 31 декабря 2015

Я разработал пакет nuget Pather.CSharp , который делает именно то, что вам нужно.

Он содержит класс Resolver с Resolve методомкоторый ведет себя как метод GetValue @ ThomasLevesque.
Пример:

IResolver resolver = new Resolver(); 
var o = new { Property1 = Property2 = "value" } }; 
var path = "Property1.Property2";    
object result = r.Resolve(o, path); //the result is the string "value"

Он даже поддерживает доступ к коллекции через индекс или доступ к словарю с помощью ключа.
Примеры путей для них:

"ArrayProperty[5]"
"DictionaryProperty[Key]"
0 голосов
/ 05 февраля 2018

Я делаю это так.Пожалуйста, дайте мне знать, если это ужасная идея, так как C # для меня просто подработка, поэтому я не эксперт objectToAddTo типа ItemsControl:

BindingExpression itemsSourceExpression = GetaBindingExression(objectToAddTo);
object itemsSourceObject = (object)itemsSourceExpression.ResolvedSource;
string itemSourceProperty = itemsSourceExpression.ResolvedSourcePropertyName;

object propertyValue = itemsSourceObject.GetType().GetProperty(itemSourceProperty).GetGetMethod().Invoke(itemsSourceObject, null); // Get the value of the property
0 голосов
/ 26 августа 2010

не уверен, что вы хотите сделать, но и как (xaml или код), но вы всегда можете назвать свой объект

<MyObject x:Name="myBindingObject" ... />

затем используйте его в коде

myBindingObject.Something.Name

или в xaml

<BeginStoryboard>
 <Storyboard>
    <DoubleAnimation
        Storyboard.TargetName="myBindingObject"
        Storyboard.TargetProperty="Background"
        To="AA2343434" Duration="0:0:2" >
    </DoubleAnimation>
 </Storyboard>
</BeginStoryboard>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...