我想在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;对象或什么?
答案 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;
}
}
....