如何使用需要视图作为参数的ViewModel在XAML中设置视图的DataContext
本文关键字:视图 ViewModel XAML DataContext 设置 参数 何使用 | 更新日期: 2023-09-27 18:27:45
我想在XAML代码中创建WPF应用程序的ViewModel
。如果您只有默认的构造函数,这很容易,但我需要View
作为参数,所以我必须自己调用Constructor
。
这是我来的地方:
<ObjectDataProvider ObjectType="{x:Type local:ViewModel}">
<ObjectDataProvider.ConstructorParameters>
<Binding Source="{RelativeSource Self}"/>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
但是,由于ConstrutorParameter
不接受Binding
:,因此抛出了一个TargetInvocationException
不能在ParameterCollection集合中使用"Binding"。只能在的"DependencyProperty"上设置"Binding"DependencyObject"。
有什么方法可以把"自我"转化为一个物体或什么东西吗?
Self已经指向一个对象。在这种情况下,您的问题是ParameterCollection不是DependencyObject,即它不是从DependencyObject类派生的,并且没有按照DependencyObjects实现约定将其属性实现为DependencyProperty,正如错误消息所示。要解决此问题,可以将类ObjectDataProvider封装到实现DependencyObject的包装类中,并将此处作为构造函数参数提供的值作为DependencyProperty。然后,您可以将"self"或任何其他资源传递给其中一个属性,并在包装器内初始化ObjectDataProvider,将该属性的值传递给ObjectDataProvide的构造函数。
class ObjectDataProviderWrapper : DependencyObject {
private ObjectDataProvider _objectDataProvider = null;
public static DependencyProperty ControlProperty = DependencyProperty.Register(.... (look that up in the manual, it depends on your use case)
public ObjectDataProvider DataProvider {
get {
if(_objectDataProvider == null) {
_objectDataProvider = new ObjectDataProvider(ControlProperty.GetValue(this));
}
return _objectDataProvider;
}
}
....
稍后在Xaml中使用ObjectDataProvider将需要一个额外的间接级别,即必须取消引用包装器,这可以使用DataContext范围来完成,例如:
<Grid DataContext="{Binding Source={StaticResource wrapper}, Path=DataProvider}" >
...
</Grid>