Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用方法的WPF树绑定问题_C#_.net_Wpf_Data Binding_Xaml - Fatal编程技术网

C# 使用方法的WPF树绑定问题

C# 使用方法的WPF树绑定问题,c#,.net,wpf,data-binding,xaml,C#,.net,Wpf,Data Binding,Xaml,我已将WPF树视图绑定到可观察的集合。当连接节点在UI中展开时,我希望调用Connection.GetDatabases(),它返回数据库的集合 我正在使用HierarchycalDataTemplate: <HierarchicalDataTemplate DataType="{x:Type dbcore:Connection}" ItemsSource="<WHAT GOES HERE?>"> <StackPanel Orientatio

我已将WPF树视图绑定到可观察的集合。当连接节点在UI中展开时,我希望调用Connection.GetDatabases(),它返回数据库的集合

我正在使用HierarchycalDataTemplate:

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

您可以创建一个函数,它接受对象并调用该方法

但是,向调用该方法的原始对象添加proeprity会简单得多,而且可能会快一点。

您可能需要添加
[过时(“请调用MyMethod()”,true)]
以防止在代码中使用属性表单。(这不会干扰数据绑定)

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

public ObservableColection<Database> Databases
{
     get
     {
        return GetDatabases();
     }
}
公共可观察选择数据库
{
得到
{
返回GetDatabases();
}
}

由于要在展开项时获取值,因此在设计时无法在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();
      }
}

私有void OneExpanded(对象发送方,RoutedEventArgs e)
{
TreeViewItem tvi=e.原始来源为TreeViewItem;
如果(tvi!=null)
{
tvi.Focus();//确保已选择展开项
tvi.ItemsSource=((连接)myTreeView.SelectedItem.GetDatabases();
}
}

为什么不使用一个属性来调用您想要返回数据的任何服务/方法?@Aaron-因为我不想。重复@Bryan-谢谢。我事先找过,但没找到。看起来很有希望。我不能向我没有创建的类添加属性@Ronnie将数据包装在自己的类中;ala是一个ViewModel…事实上,您有一个在洋葱上还没有创建的类,这本身就是一个危险信号。应该避免绑定到调用可能长时间运行的方法的属性。