我已将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属性中使用什么。
答案 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();
}
}