WPF - получение значения свойства из пути привязки
если у меня есть объект, называемый MyObject, который имеет свойство MyChild, которое имеет свойство Name. Как я могу получить значение этого свойства Name, если все, что у меня есть, - это путь привязки (т.е. "MyChild.Name" ) и ссылка на MyObject?
MyObject
-MyChild
-Name
Ответы
Ответ 1
Я нашел способ сделать это, но это довольно уродливо и, вероятно, не очень быстро... В принципе, идея состоит в том, чтобы создать привязку с данным путем и применить его к свойству объекта зависимости. Таким образом, привязка выполняет всю работу по извлечению значения:
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));
}
}
Ответ 2
Я разработал пакет nuget Pather.CSharp, который делает именно то, что вам нужно.
Он содержит класс Resolver
, который имеет метод Resolve
, который ведет себя как метод @ThomasLevesque GetValue
.
Пример:
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]"
Ответ 3
не уверен, что вы хотите делать, но и как (xaml или code), но вы всегда можете назвать свой объект
<MyObject x:Name="myBindingObject" ... />
a затем использовать его в коде
myBindingObject.Something.Name
или в xaml
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="myBindingObject"
Storyboard.TargetProperty="Background"
To="AA2343434" Duration="0:0:2" >
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
Ответ 4
Я делаю это так. Пожалуйста, дайте мне знать, если это ужасная идея, так как С# - это просто боковая работа для меня, поэтому я не эксперт 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