2012-11-15 54 views
0

我有一個簡單的自定義用戶控件:結合依賴屬性

<Grid x:Name="LayoutRoot"> 
    <StackPanel> 
     <TextBlock Text="{Binding DisplayText}"/> 
     <TextBlock Text="{Binding PersonName}"/> 
    </StackPanel> 
</Grid> 

我用它在MainPage.xaml中,如下所示:

<local:WindowsPhoneControl1 x:Name="customControl" DisplayText="test"> 

</local:WindowsPhoneControl1> 

如果MainPage.xaml.cs中我做的:

PersonName = "George"; 
customControl.DataContext = this; 

然後喬治顯示,但測試不是。這是有道理的,但我不知道如何綁定到DisplayText屬性。

當然,以下是行不通的,因爲喬治不會被顯示:

customControl.DataContext = customControl; 

請注意,這應該WP/Silverlight開發工作,所以像AncestorType的東西可能不可用(不一定有用)

+0

您應該閱讀這篇關於依賴項屬性值優先級的文章:http://msdn.microsoft.com/en-us/library/ms743230.aspx – Guillaume

回答

1

可能有多種方法來做到這一點。以下是一個:爲您的用戶控件添加一個依賴屬性PersonName,併爲DisplayText定義一個常規屬性(不需要DP,因爲您沒有綁定它)。

public static readonly DependencyProperty = 
    DependencyProperty.Register("PersonName", typeof(string), typeof(MyUserControl), null); 

public string DisplayText { get; set; } 
public string PersonName 
{ 
    get { return (string)GetValue(PersonNameProperty); } 
    set { SetValue(PersonNameProperty, value); } 
} 

然後,設置用戶控制的DataContextLayoutRoot(在構造函數中初始化之後)。

public MyUserControl() 
{ 
    InitializeComponent(); 
    LayoutRoot.DataContext = this; 
} 

編輯以下方式可能會更容易(肯定是更直接的),但需要的Silverlight 5,你可以用它使用RelativeSource綁定到財產DisplayText

<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, 
           Path=DisplayText}"/> 

所以這裏的用戶控件的DataContext的仍然可以設置爲MainPage,和爲這一個元素的數據源可以被指向所述用戶控制的代碼隱藏類。

+0

添加PersonName依賴項屬性迫使我寫類似PersonName =「{Binding PersonName}「對嗎?我希望我可以使用你的其他解決方案,但不幸的是我不能使用AncestorType(如解釋) – uWat

+0

@uWat'AncestorType'應該適用於Silverlight的更高版本......如果不是,我想知道是否可以使用'ElementName'。正在檢查... – McGarnagle

+0

@uWat hm,好吧,Silverlight支持AncestorType,但僅支持版本5.並且'ElementName'似乎不起作用。但是,依賴屬性方法需要'{綁定PersonName}'。 – McGarnagle