2010-02-17 139 views
8

我有一个包含名为MyDP的自定义DependencyProperty的WPF UserControl。我想将它绑定到ViewModel上的一个属性(它是作为UserControl的DataContext注入的)。我知道,通过设置用户控件的父窗口的XAML声明这样的结合,做这件事:设置绑定到WPF用户控件中的自定义DependencyProperty

<Window x:Class="MyNamespace.Views.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:views="clr-namespace:MyNamespace.Views"> 
    <StackPanel> 
     <views:MyControl MyDP="{Binding Path=MyVMProperty, Mode=OneWayToSource}"/> 
    </StackPanel> 
</Window> 

这工作得很好,但作为替代我就可以建立UserControl的XAML内部的结合,类似我如何将UserControl中的单个控件的绑定设置为ViewModel的其他属性?

回答

15

你不能直接做你原先想的。你可能试过并且有一些编译错误。您不能在UserControl的根XAML中内联设置自定义属性,因为元素类型为UserControl,因此编译器会根据该类型强制执行属性名称,而不是您的自定义类型。您可以通过更改为附加属性来解决此问题,但实际上会改变MyDP的含义。相反,您可以在UserControl的Style中设置一个默认值,并通过执行原始示例中的内容获得可以在任何声明的实例上覆盖它的额外好处。你的用户控件的根元素下,将此:

<UserControl.Style> 
    <Style> 
     <Setter Property="views:MyControl.MyDp" Value="{Binding Path=MyVMProperty, Mode=OneWayToSource}" /> 
    </Style> 
</UserControl.Style> 
+0

,完美的工作,谢谢!这不是WPF noob最显而易见的方法,但是您的解释肯定会说明情况。 –

+0

谢谢。虽然我注意到我想将UC绑定到datacontext,所以OneTime对我来说也是合适的模式。 – GarethJ

+0

非常有帮助。谢谢。 – tronious

1

你也可以定义在主窗口的构造函数的结合,就像这样:

public MainWindow() 
{ 
    InitializeComponent(); 
    SetBinding(MyDPProperty, "MyVMProperty"); 
} 
相关问题