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

时间:2015-12-22 07:32:39

标签: c# wpf xaml

我想在XAML代码中创建我的WPF应用程序的ViewModel。 如果您只有默认构造函数,这很简单,但我需要View作为参数,所以我必须自己调用Constructor

就我而言:

<ObjectDataProvider ObjectType="{x:Type local:ViewModel}">
    <ObjectDataProvider.ConstructorParameters>
        <Binding Source="{RelativeSource Self}"/>
    </ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>

但是这样会引发TargetInvocationException,因为ConstrutorParameter不接受Binding

  

&#34;结合&#34;不能在ParameterCollection集合中使用。   &#34;结合&#34;只能在&#34; DependencyProperty&#34;上设置一个   &#34;的DependencyObject&#34;

有没有办法转换&#34; Self&#34;对象或什么?

1 个答案:

答案 0 :(得分:1)

自我已经指向一个物体。在这种情况下,您的问题是ParameterCollection不是DependencyObject,即它不是从DependencyObject类派生的,并且没有按照DependencyObject实现约定将其属性实现为DependencyProperties,就像错误消息所暗示的那样。 要解决此问题,可以将ObjectDataProvider类包装到实现DependencyObject的包装类中,并将此处提供的值作为构造函数参数作为DependencyProperties。然后你可以通过&#34; self&#34;或者其他资源到这些属性之一并初始化包装器中的ObjectDataProvider,将属性的值传递给ObjectDataProvider的构造函数。

Json

稍后在您的Xaml中使用ObjectDataProvider则需要一个额外的间接级别,即您必须取消引用您的包装器,这可以使用DataContext范围来完成,例如:

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;
        }
    }
....