2013-05-15 66 views
4

在Windows應用商店應用中,您創建了一個用戶控件來封裝和重新使用代碼隱藏和佈局XAML。一個簡單的用戶控件可能如下所示:如何綁定到用戶控件的屬性?

<UserControl> 
    <StackPanel> 
     <TextBlock Text="First Name" /> 
     <TextBox x:Name="MyTextBox" /> 
    </StackPanel> 
</UserControl> 

現在,我想設置綁定。所以我使用暴露UI控件的Text屬性的屬性來創建代碼隱藏。類似這樣的:

public string TextBoxText 
{ 
    get { return MyTextBoxText.Text; } 
    set { MyTextBoxText.Text = value; } 
} 

但是,這是行不通的。看起來像數據綁定到用戶控件是XAML UI的重要組成部分。但是它是如何完成的?

回答

10

用戶控件中只有一個屬性實現支持在使用頁面中進行綁定。這是一個依賴屬性。該實現非常簡單,但您還必須包含已更改的事件以直接與UI進行交互,因爲依賴項屬性是控件上的靜態屬性。像這樣:

public string TextBoxText 
{ 
    get { return (string)GetValue(TextBoxTextProperty); } 
    set { SetValue(TextBoxTextProperty, value); } 
} 

public static readonly DependencyProperty TextBoxTextProperty = 
    DependencyProperty.Register("TextBoxText", typeof(string), typeof(MyUserControl), 
    new PropertyMetadata(string.Empty, OnTextBoxTextPropertyChanged)); 

private static void OnTextBoxTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    (d as MyUserControl).MyTextBox.Text = e.NewValue.ToString(); 
} 

我承認,這並不是很明顯。但希望現在你知道,這將節省你幾個小時的搜索並試圖弄清楚。再次,您只能綁定到用戶控件的依賴項屬性。而且,您只能使用已更改的事件將靜態線程的UI值設置爲關閉。

祝你好運!

+0

唯一的實際綁定是由用戶控件的父級綁定到用戶控件的屬性。像''。 –

+1

你會如何將一個類似Tapped的事件與ICommand相關聯?喜歡這個? public static readonly DependencyProperty LogoutCommandProperty = DependencyProperty.Register(「LogoutCommand」,typeof(ICommand),typeof(MyUserControl),null); 私人無效PathLogout_Tapped( 對象發件人, Windows.UI.Xaml.Input.TappedRoutedEventArgs E) { LogoutCommand .Execute(空);?' –

0

你總是談論綁定 - 但你實際上並沒有將textbox.textproperty綁定到你的屬性(你設置它)。

如果你想使用時綁定,創建一個依賴屬性,綁定文本框的文本屬性是這樣的:

<TextBox x:Name="MyTextBox" **Text="{Binding TextBoxText, Mode=TwoWay}"** /> 

不要忘了DataContext屬性設置用戶控件的用戶控件實例:

public MyUserControl1() 
{ 
    this.InitializeComponent(); 

    // Set the datacontext to the usercontrol-instance. 
    // If you don't, the binding will use the usercontrol's parent-datacontext. 
    this.DataContext = this; 
} 
+0

所以,你的辦法行不通的原因是因爲父'用戶控件「不綁定到」用戶控件「的」TextBoxText「**屬性,而是綁定到」用戶控件「的」TextBoxText「**依賴項屬性**。不過,「用戶控件」TextBox綁定到「TextBoxText」屬性。這是不匹配的。因此,即使您在TextBoxText **屬性**中實現了'INotifyPropertyChanged',TextBoxText **依賴項屬性**也不會引發該事件,因此您的示例中的綁定不會更新UI。你應該測試它。 –

+0

多麼尷尬......謝謝你的提示。我只測試一種方式!謝謝! – Alexander

相關問題