在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
需要一个静态方法,或者它创建自己的示例并使用该方法。
例如,使用Matt的答案,我得到:
系统.窗口.数据错误:33:ObjectDataProvider无法创建对象;类型=“根对象”;错误='构造函数的参数错误。'
系统.窗口.数据错误:34:对象数据提供程序:尝试对类型调用方法时失败;方法=“获取子项”;类型=“根对象”;错误='无法在目标上调用指定的成员。' TargetException:'系统。反射。TargetException:非静态方法需要目标。
8条答案
按热度按时间aiqt4smr1#
另一种可能适用于您的方法是创建一个自定义的
IValueConverter
,该IValueConverter
将方法名作为参数,因此它的使用方式如下:这个转换子会使用反映(Reflection)来寻找并叫用方法。这要求方法没有任何参数。
下面是这样一个转换器的源代码示例:
和相应的单元测试:
请注意,此转换器不强制
targetType
参数。fnx2tebb2#
不确定它在您的场景中的工作效果如何,但是您可以使用
ObjectDataProvider
上的MethodName
属性,让它调用特定的方法(使用MethodParameters
属性的特定参数)来检索其数据。以下是直接取自MSDN页面的片段:
这是一个
ObjectDataProvider
,它在TemperatureScale
类的示例上调用ConvertTemp
方法,传递两个参数(0
和TempType.Celsius
)。1szpjjfi3#
是否必须绑定到方法?
你能绑定到一个getter是方法的属性吗?
zi8p0yeb4#
除非您可以添加一个属性来调用该方法(或者创建一个添加该属性的 Package 类),否则我所知道的唯一方法就是使用ValueConverter。
gywdnpxw5#
ObjectDataProvider还有一个ObjectInstance属性,可以用来代替ObjectType
acruukt96#
您可以使用
System.ComponentModel
动态定义类型的属性(它们不是编译的元数据的一部分)。我在WPF中使用了这种方法来支持绑定到将其值存储在字段中的类型,因为绑定到字段是不可能的。ICustomTypeDescriptor
和TypeDescriptionProvider
类型可能允许您实现您想要的结果。根据this article:TypeDescriptionProvider
可让您撰写实作ICustomTypeDescriptor
的个别类别,然后将这个类别注册为其他型别之描述的提供者。我自己还没有尝试过这种方法,但我希望它对你的情况有所帮助。
0tdrvxhp7#
若要系结至WPF案例中的对象方法,您可以系结至传回委派的属性。
t3irkdon8#
与Drew Noakes的answer相同,但具有使用扩展方法的能力。