2010-08-18 69 views
1

我很難理解如何在C#和xaml代碼之間使用依賴項屬性。 這是我的問題的SMaL公司代碼示例使用依賴項屬性設置標籤內容

XAML代碼:

<Window x:Class="WpfChangeTextApplication.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<StackPanel> 
    <Label Name="statusTextLabel" Content="{Binding StatusText}"></Label> 
    <Button Name="changeStatusTextButton" Click="changeStatusTextButton_Click">Change Text</Button> 
</StackPanel> 

C#代碼:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent();    
    } 

    public string StatusText 
    { 
     get { return (string)GetValue(StatusTextProperty); } 
     set { SetValue(StatusTextProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for StatusText. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty StatusTextProperty = 
     DependencyProperty.Register("StatusText", typeof(string), typeof(MainWindow)); 

    private void changeStatusTextButton_Click(object sender, RoutedEventArgs e) 
    { 
     StatusText = "Button clicked"; 
    } 
} 

所以,我的問題是,標籤statusTextLabel劑量沒有更新當我點擊按鈕時。我的麻煩是,我不知道我在做什麼錯誤的代碼的哪一部分,是在xaml還是在C#中?在xaml中,我可能在綁定中做錯了什麼?還是我錯過了在C#代碼中做的事情?

回答

2

默認情況下,綁定路徑相對於當前元素的DataContext屬性。您尚未將其設置爲任何內容,因此無法解析綁定。如果你想在你的窗口類上使用StatusText屬性,那麼有兩種方法。一種是使用與FindAncestor的的RelativeSource綁定找到樹中的窗口和直接綁定到其屬性:

<Label Name="statusTextLabel" Content="{Binding StatusText, 
    RelativeSource={RelativeSource AncestorType=Window}}"></Label> 

另外就是窗口的DataContext設置爲自身,所以它會被繼承由標籤。例如,在你的構造:

public MainWindow() 
{ 
    this.DataContext = this; 
    InitializeComponent(); 
} 

對於大多數應用程序,你會真的想要一個單獨的類來表示數據,你會設置類作爲DataContext的實例。您還可以使用普通的CLR屬性而不是依賴項屬性,但如果您想要在屬性更改時通知UI,則需要實現INotifyPropertyChanged。在編寫自定義控件時,依賴項屬性更有用,並希望用戶能夠使用數據綁定來設置屬性。