2010-12-15 5 views
0

Ich habe eine WPF-TreeView an eine ObservableCollection gebunden. Wenn ein Verbindungsknoten in der Benutzeroberfläche erweitert wird, möchte ich Connection.GetDatabases() aufrufen, wodurch eine Auflistung von Datenbanken zurückgegeben wird.WPF-Baumbindungsproblem mit Methoden

Ich verwende HierarchicalDataTemplate:

<HierarchicalDataTemplate DataType="{x:Type dbcore:Connection}" ItemsSource="<WHAT GOES HERE?>"> 
      <StackPanel Orientation="Horizontal"> 
       <Image Source="{StaticResource DataServerIcon}" Margin="5,2" /> 
       <TextBlock Text="{Binding Converter={StaticResource connToStringConverter}}" /> 
      </StackPanel> 
</HierarchicalDataTemplate> 

Aber weil ich eine Methode anstelle einer Eigenschaft verwenden möchten, ich bin nicht sicher, was in der Itemssource-Eigenschaft zu verwenden.

+0

Warum nicht eine Eigenschaft, die einfach aufrufen, was auch immer Service/Methode Sie die Daten zurückgeben möchten? –

+0

@Aaron - Weil ich nicht will. –

+1

Duplikat von http://stackoverflow.com/questions/502250/bind-to-a-method-in-wpf –

Antwort

2

Da Sie die Werte erhalten möchten, wenn das Element erweitert wird, können Sie es nicht in XAML zur Entwurfszeit tun. Sie können es tun, wenn Sie Ihren Artikel in Code hinter erweitert:

0

Sie können eine IValueConverter machen, die Ihr Objekt übernimmt und die Methode aufruft.

Es wäre jedoch viel einfacher und wahrscheinlich ein wenig schneller, dem ursprünglichen Objekt, das die Methode aufruft, eine Funktion hinzuzufügen.
Sie können [Obsolete("Please call MyMethod() instead.", true)] hinzufügen, um zu verhindern, dass das Eigenschaftenformular im Code verwendet wird. (Dies beeinträchtigt die Datenbindung nicht)

+0

Die Bindung an Eigenschaften, die potenziell lang andauernde Methoden aufrufen, sollte vermieden werden. – markmnl

+0

@Mrk: Offensichtlich. – SLaks

-1

Warum nicht einfach eine Eigenschaft verwenden, die die Daten über die von Ihnen gewünschte Methode/Dienstleistung zurückgibt? Sie können nicht nativ an eine Methode binden. Also entweder Zugriff auf Ihre Methode innerhalb der Eigenschaften Getter oder verwenden Sie eine IValueConverter und Parameter, die die Methode zum Aufruf enthalten könnte.

+0

Ich kann keine Eigenschaft zu einer Klasse hinzufügen, die ich nicht erstellt habe! –

+2

@Ronnie Wickeln Sie die Daten in Ihrer eigenen Klasse; aa ViewModel ... die Tatsache, dass du eine Klasse hast, die du nicht so weit oben auf der Zwiebel erschaffen hast, ist eine rote Flagge an und für sich. –