2010-02-06 15 views
10

Piszę formant niestandardowy i mam ścieżkę właściwości jako ciąg (pomyśl comboBox.SelectedValuePath).
Jaki jest najlepszy sposób w kodzie do oceny tego ciągu dla dowolnego obiektu?WPF Jak oceniać ścieżkę właściwości?

Oczywiście mogę sam go przetworzyć, ale jest to hack i chcę, aby ścieżka obsługiwała wszystko, co robi comboBox.SelectedValuePath (dla spójności).

Wynik (dzięki Aran Mulholland):

Nie wiesz, o wydajności, ale nie obchodzi mnie dużo do wykonywania teraz.

public class BindingEvaluator { 
    #region Target Class 

    private class Target : DependencyObject { 
     public static readonly DependencyProperty ResultProperty = DependencyProperty.Register(
      "Result", typeof(IEnumerable), typeof(BindingEvaluator) 
     ); 

     public object Result { 
      get { return this.GetValue(ResultProperty); } 
      set { this.SetValue(ResultProperty, value); } 
     } 
    } 

    #endregion 

    public object GetValue(object source, string propertyPath) { 
     var target = new Target(); 
     BindingOperations.SetBinding(target, Target.ResultProperty, new Binding(propertyPath) { 
      Source = source, 
      Mode = BindingMode.OneTime 
     }); 
     return target.Result; 
    } 
} 
+0

Czy należy zauważyć, że zadeklarowany typ DependencyProperty w Target jest IEnumerable, gdy właściwość Result jest typu obiektu? – dtm

+0

@dtm prawdopodobnie po prostu mój błąd - opublikowałem wersję pośrednią zamiast ostateczną. jednak to było dawno temu i nie pamiętam. jeśli znajdę ten kod, poprawię to pytanie, w przeciwnym razie, jeśli przetestowałeś to, proszę poinformuj mnie o swoich odkryciach. –

+0

Wprowadziłem coś takiego z dopasowanymi typami dla właściwości dependency i samej właściwości; jednak i, co zaskakujące, nadal działa, jeśli podstawię IEnumerable w miejsce Object w DepedencyProperty.Register. Nie jestem pewien, co z tym zrobić ... – dtm

Odpowiedz

6

Utwórz obiekt, który ma jedną właściwość zależność typu obiektu, ustaw wiązania na nim ścieżki nieruchomości jako drogi i swojej arbitralnej obiektu jako źródła. wiązanie zostanie wykonane i zobaczysz, co (jeśli coś) znajduje się na końcu ścieżki właściwości. Jest to jedyny sposób, w jaki udało mi się zrobić takie rzeczy w kodzie. możesz napisać rekursywny silnik refleksyjny, który mógłby podążać ścieżką właściwości, ale już to zrobiono, używamy go, gdy wiążemy. zajmie ci pięć minut na napisanie :)

+0

Dzięki, to działa, dodając wynikowy kod do pytania. –

+1

Używam go również w tym dziwnym przypadku, zastanawiam się nad wydajnością, ale wpf używa bindowania w każdym miejscu, więc co dalej ... –

+1

WPF może mieć buforowanie w miejscu, podczas gdy kod w obecnej formie nie. Przynajmniej buforowanie wiązania między wieloma połączeniami może teoretycznie być lepsze, ale nie obchodzi mnie to wystarczająco, aby zweryfikować, chyba że zauważę spowolnienie. :) –

Powiązane problemy