2010-02-17 133 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"); 
} 
相關問題