使用方法的WPF树绑定问题

时间:2010-12-15 16:25:35

标签: c# .net wpf data-binding xaml

我已将WPF TreeView绑定到ObservableCollection。当一个Connection节点在UI中展开时,我希望调用Connection.GetDatabases(),它返回一个Databases集合。

我正在使用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属性中使用什么。

3 个答案:

答案 0 :(得分: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();
      }
}

答案 1 :(得分:0)

您可以创建一个IValueConverter来获取您的对象并调用该方法。

然而,为调用该方法的原始对象添加一个proeprty会更简单,也可能更快一些。
您可能希望添加[Obsolete("Please call MyMethod() instead.", true)]以防止在代码中使用属性表单。 (这不会干扰数据绑定)

答案 2 :(得分:-1)

为什么不简单地使用通过您想要的任何方法/服务返回数据的属性?你不能本地绑定到一个方法;所以要么在属性getter中访问你的方法,要么使用IValueConverter和可能包含要调用的方法的参数。

public ObservableColection<Database> Databases
{
     get
     {
        return GetDatabases();
     }
}