【发布时间】:2010-10-04 20:58:03
【问题描述】:
在这种情况下,如何在 WPF 中绑定到对象方法?
public class RootObject
{
public string Name { get; }
public ObservableCollection<ChildObject> GetChildren() {...}
}
public class ChildObject
{
public string Name { get; }
}
XAML:
<TreeView ItemsSource="some list of RootObjects">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type data:RootObject}"
ItemsSource="???">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type data:ChildObject}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
这里我想在树的每个RootObject 上绑定GetChildren 方法。
EDIT 绑定到 ObjectDataProvider 似乎不起作用,因为我正在绑定到项目列表,而 ObjectDataProvider 需要静态方法,或者它创建自己的方法实例并使用它。
例如,使用马特的答案,我得到:
System.Windows.Data 错误:33:ObjectDataProvider 无法创建对象;类型='RootObject'; Error='构造函数的参数错误。'
System.Windows.Data 错误:34:ObjectDataProvider:尝试调用类型上的方法失败;方法='GetChildren';类型='RootObject'; 'Error='指定的成员不能在目标上调用。' TargetException:'System.Reflection.TargetException: 非静态方法需要一个目标。
【问题讨论】:
-
是的,你是对的。 ObjectDataProvider 确实有一个 ObjectInstance 属性(在特定实例上调用它的方法),但我不认为它是一个依赖属性,所以你不能绑定它(AFAIK)。
-
是的,我尝试绑定到 ObjectInstance,发现它不是依赖属性。
-
无论如何我都会把我的答案留在那里,既可以为您的更新提供一些背景信息,也可以帮助其他发现此问题的人遇到足够类似的问题。
-
你真的需要绑定到ObjectInstance吗? (它会改变)假设您可以创建自己的更改事件处理并在代码中更新 ObjectDataProvider...
-
刚刚用一些源代码更新了我的答案,一年后。
标签: .net wpf data-binding xaml