如何使用需要视图作为参数的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"。

有什么方法可以把"自我"转化为一个物体或什么东西吗?

如何使用需要视图作为参数的ViewModel在XAML中设置视图的DataContext

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>