2010-04-19 71 views
1

我想使用依賴項屬性,以便我的標籤顯示在列表框中選擇的值。這只是爲了更清楚地理解依賴屬性的工作。依賴項屬性列表框

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WPFToolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    xmlns:local="clr-namespace:WpfApplication1" x:Name="MyWindow" 
    Height="200" Width="300" > 
<StackPanel> 
     <ListBox x:Name="lbColor" Width="248" Height="56" ItemsSource="{Binding TestColor}"/> 

     <StackPanel> 
      <Label Content="{Binding Path=Test, ElementName=lbColor}" /> 
     </StackPanel> 
    </StackPanel> 

</Window> 

代碼背後,

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 

     public ObservableCollection<string> TestColor { get; set; } 

     public String Test 
     { 
      get { return (String)GetValue(TestProperty); } 
      set { SetValue(TestProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for Title. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty TestProperty = 
      DependencyProperty.Register("Test", typeof(String), typeof(ListBox), new UIPropertyMetadata("Test1")); 



     public Window1() 
     { 
      InitializeComponent(); 
      TestColor = new ObservableCollection<string>(); 
      DataContext = this; 
      TestColor.Add("Red"); 
      TestColor.Add("Orange"); 
      TestColor.Add("Yellow"); 
      TestColor.Add("Green"); 
      TestColor.Add("Blue"); 
     } 
    } 
} 

任何人都可以解釋我這個使用依賴屬性如何將我accompalish。不知何故,我對依賴屬性概念非常困惑,我只是想看到一個可行的例子。

+0

對於你完成使用依賴屬性,看看這裏:http://stackoverflow.com/questions/1723756/why-dependency-properties/1723831#1723831 – 2010-04-19 18:06:38

+0

我明白,有很多例子顯示DP以及與爲什麼要使用它有關的文檔,但我希望看到一些有用的信息,以便讓我瞭解DP在哪一步執行的操作。就像它是如何被調用的,在什麼時候設置了值,什麼是設置的值以及所有.. – developer 2010-04-19 18:20:59

回答

1

你需要讓你的列表框「中選擇」在當前文本:

<StackPanel> 
    <!-- Add selected item binding --> 
    <ListBox 
     x:Name="lbColor" Width="248" Height="56" 
     ItemsSource="{Binding TestColor}" 
     SelectedItem="{Binding Test}" 
    /> 

    <StackPanel> 
     <!-- No need for elementname - just use Test on the DataContext --> 
     <Label Content="{Binding Path=Test}" /> 
    </StackPanel> 
</StackPanel> 
+0

上面的代碼在將ListBox的Dependency屬性更改爲Window1後有效。主席先生,你能否解釋我在技術上發生了什麼。我的意思是,在點擊列表框值之後設置DP的值。當我想在XAML中使用DP時,我是否必須將DP的值設置爲某個源,就像我們在此處所做的一樣? – developer 2010-04-19 18:47:31

+0

哦,是的 - 我錯過了那不是那樣。您需要將DependencyProperty類型設置爲您的類,因爲您要在類上定義DP,而不是在列表框上。現在,發生的事情是,當您選擇一個新項目(在列表框中)時,列表框會通過綁定回您的Window1類來設置「SelectedItem」值。該標籤反映了該物業的新價值,因爲它是一個DP,並且它會自我更新。 – 2010-04-19 18:52:22

1

我喜歡把數據綁定大哥。綁定系統將自己設置爲觀察其各種已註冊的綁定,並在發生適當條件(例如,FocusLost或PropertyChanged)時,綁定系統將源值複製到目標。對於雙向或OneWayToSource綁定,如果正確的標準發生,綁定系統甚至會將目標複製到源。

目標必須是DependencyProperty,因爲這是一種特殊的屬性,它知道如何依賴其他值。 XAML {Binding}正在做的事情是創建一個新的BindingExpression,然後調用BindingOperations.SetBinding,該BindingOperations.SetBinding用綁定系統註冊一個特定的BindingExpression,因此它知道如何觀察和執行更新。

這樣做的好處是,目標和源都不需要承擔編寫代碼以顯式更新其他代碼的責任。如果我有知道如何提供顏色列表的代碼,爲什麼我應該關心如何將顏色呈現給用戶?因爲綁定系統負責綁定,所以使用我的顏色的目標是列表框,樹視圖或知道如何處理項目列表的任何其他對象對我來說無關緊要。我可以專注於我關心的事情(我公開的接口),並且不必關心與其他接口進行粘合的混亂細節。