2010-12-15 3 views
0

私はObservableCollectionにWPF TreeViewをバインドしました。 ConnectionノードがUIで展開されると、Connection.GetDatabases()が呼び出され、データベースのコレクションが返されます。メソッドを使用したWPFツリーバインディングの問題

私は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> 

をしかし、私は代わりに、プロパティのメソッドを使用したいので、私はItemsSourceプロパティに何を使用するかわかりません。

+0

データを返すサービス/メソッドを単に呼び出すプロパティを使用しないのはなぜですか? –

+0

@アロン - 私はしたくないから。 –

+1

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

答えて

2

アイテムが展開されているときに値を取得したいので、デザイン時にXAMLで値を取得できません。商品がコードの背後に展開されているときに行うことができます。

<TreeView TreeViewItem.Expanded="OnExpanded" ... > 


private void OnExpanded(object sender, RoutedEventArgs e) 
{ 
     TreeViewItem tvi = e.OriginalSource as TreeViewItem; 
     if (tvi != null) 
     { 
     tvi.Focus(); // to ensure the expanded item is selected 
     tvi.ItemsSource = ((Connection)myTreeView.SelectedItem).GetDatabases(); 
     } 
} 
0

IValueConverterはオブジェクトを受け取り、メソッドを呼び出すことができます。

しかし、メソッドを呼び出す元のオブジェクトにproeprtyを追加するほうがはるかに簡単で、おそらく少し速くなります。
[Obsolete("Please call MyMethod() instead.", true)]を追加して、プロパティフォームがコードで使用されないようにすることができます。 (これはデータバインディングを妨げません)

+0

潜在的に実行中のメソッドを呼び出すプロパティへのバインドは避ける必要があります。 – markmnl

+0

@ Mr:明らかに。 – SLaks

-1

単純に、必要なメソッド/サービスを介してデータを返すプロパティを使用しないでください。メソッドにネイティブにバインドすることはできません。プロパティゲッター内でメソッドにアクセスするか、呼び出すメソッドを含む可能性のあるパラメータIValueConverterを使用してください。

+0

私は作成していないクラスにプロパティを追加できません! –

+2

@Ronnie自分のクラスでデータをラップします。 Ala a ViewModel ...これまでに作成していなかったクラスを玉ねぎで作ったという事実は、それ自体の赤旗です。 –

関連する問題