2010-08-26 17 views
13

jeśli mam powiedzieć o nazwie obiektu MyObject, który ma właściwość o nazwie MyChild, która sama ma właściwość o nazwie Name. Jak mogę uzyskać wartość tej właściwości Name, jeśli wszystko, co mam, jest ścieżką wiążącą (tj. "MyChild.Name") i odniesieniem do MyObject?WPF - Uzyskanie wartości nieruchomości ze ścieżki wiązania

MyObject 
    -MyChild 
    -Name 
+0

można podać przykład jak chcesz to wykorzystać ? – Rachel

Odpowiedz

19

Znalazłem sposób Aby to zrobić, ale jest dość brzydki i prawdopodobnie niezbyt szybki ... Zasadniczo chodzi o utworzenie powiązania z podaną ścieżką i zastosowanie go do właściwości obiektu zależności. W ten sposób wiązania wykonuje całą pracę od pobierania wartości:

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)); 
    } 
} 
+0

Wydaje się, że wiele maszyn ma wartość wiążącą, ale nie mogę wymyślić lepszego rozwiązania ogólnego przeznaczenia. +1 i Pozdrawiam. – Berryl

+0

Doskonale, dzięki Thomas! Powodem, dla którego potrzebuję czegoś takiego, jest to, że napisałem niestandardowe rozszerzenie znaczników do ładowania obrazów. To rozszerzenie ma właściwość Name nazwy obrazu, którą teraz chcę powiązać z właściwością modelu w DataTemplate, która używa rozszerzenia znaczników. Jednak nie mogę się związać, ponieważ Nazwa nie jest DP, ani nie może być :(To było jedyne rozwiązanie, jakie mogłem wymyślić, więc spróbuję tego kodu. Dzięki. – devdigital

+0

To działa idealnie na moje potrzeby (uzyskiwanie i ustawianie wartości właściwości modelu widoku z uwzględnieniem ścieżki wiązania) Czy istnieje podobny sposób uzyskania _type_ właściwości, która byłaby związana z daną ścieżką wiązania? – lesscode

0

nie wiesz, co chcesz zrobić, ale i jak (XAML lub kodu) ale zawsze można nazwać obiekt

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

następnie używać go w kodzie

myBindingObject.Something.Name 

lub w xaml

<BeginStoryboard> 
<Storyboard> 
    <DoubleAnimation 
     Storyboard.TargetName="myBindingObject" 
     Storyboard.TargetProperty="Background" 
     To="AA2343434" Duration="0:0:2" > 
    </DoubleAnimation> 
</Storyboard> 
</BeginStoryboard> 
3

opracowałem nuget packagePather.CSharp że robi dokładnie to, czego potrzebujesz.

Zawiera klasę Resolver, która ma metodę Resolve, która zachowuje się jak metoda @ ThomasLevesque'a GetValue.
Przykład:

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" 

nawet obsługuje dostęp zbiórki pośrednictwem indeksu lub słowniku dostępu poprzez klucz.
Przykład ścieżki dla nich są:

"ArrayProperty[5]" 
"DictionaryProperty[Key]" 
+0

Czy obsługuje on dostęp do jawnie zaimplementowanych właściwości interfejsu i ukrytych właściwości? – Grx70

+0

@ Grx70 Tak. Działa poprzez refleksję, więc jeśli właściwość istnieje na obiekcie i jest publiczna, dostanie swoją wartość. – Domysee

0

Robię to w ten sposób. Proszę dać mi znać, jeśli jest to fatalny pomysł, jak C# jest tylko praca boczny dla mnie więc nie jestem ekspertem objectToAddTo jest typu 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 
Powiązane problemy