2009-10-07 64 views
1

我試圖更好地瞭解什麼依賴屬性和它們是什麼不是。我已經構建了下面的示例,它使組合框的選擇可以根據用戶如何移動滑塊進行更改。如何擴展此依賴項屬性示例以重新創建DockPanel.Dock =「Top」類的依賴項屬性?

在創建這一過程中,我瞭解到依賴項屬性實際上與INotifyPropertyChanged無關,因爲它在ViewModel屬性中使用,這簡化了以下示例。

但是現在我將如何從下面的這個例子中重新創建在DockPanel.Dock="Top"中看到的依賴屬性,例如,所以我可以啓用以下一種XAML使用:

<local:ExtendedComboBox 
    Margin="5 5 5 0" 
    DataIdCode="{Binding ElementName=TheSource, Path=Value}"> 
    <Image local:ExtendendedComboBox="Left" ... /> 
    <TextBlock local:ExtendendedComboBox="Right" ... /> 
</local:ExtendedComboBox> 

這可能嗎?這與依賴屬性的使用類似於下面更直接的例子,還是像INotifyPropertyChanged一樣,但是另一種 WPF中的綁定技術?

這裏是滑塊/組合框例如:

XAML:

<Window x:Class="TestDependency9202.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TestDependency9202" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <StackPanel 
      Margin="5 5 5 0" 
      Orientation="Horizontal"> 
      <TextBlock Text="Customers" 
         Margin="0 0 3 0"/> 
      <Slider x:Name="TheSource" 
       HorizontalAlignment="Left" 
       Value="0" 
       Width="50" 
       SnapsToDevicePixels="True" 
       Minimum="0" 
       Margin="0 0 3 0" 
       Maximum="1"/> 
      <TextBlock Text="Employees"/> 
     </StackPanel> 
     <local:ExtendedComboBox 
      Margin="5 5 5 0" 
      DataIdCode="{Binding ElementName=TheSource, Path=Value}"/> 
    </StackPanel> 
</Window> 

代碼隱藏:

using System.Windows; 
using System.Windows.Controls; 
using System.ComponentModel; 

namespace TestDependency9202 
{ 
    public partial class ExtendedComboBox : ComboBox 
    { 
     public static readonly DependencyProperty DataIdCodeProperty = 
      DependencyProperty.Register("DataIdCode", typeof(string), typeof(ExtendedComboBox), 
       new PropertyMetadata(string.Empty, OnDataIdCodePropertyChanged)); 

     private static void OnDataIdCodePropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
     { 
      ExtendedComboBox extendedComboBox = dependencyObject as ExtendedComboBox; 
      extendedComboBox.OnDataIdCodePropertyChanged2(e); 
     } 

     private void OnDataIdCodePropertyChanged2(DependencyPropertyChangedEventArgs e) 
     { 
      if (DataIdCode == "0") 
      { 
       Items.Clear(); 
       Items.Add("customer1"); 
       Items.Add("customer2"); 
       Items.Add("customer3"); 
      } 
      else if (DataIdCode == "1") 
      { 
       Items.Clear(); 
       Items.Add("employee1"); 
       Items.Add("employee2"); 
       Items.Add("employee3"); 
      } 
      this.SelectedIndex = 0; 
     } 


     public string DataIdCode 
     { 
      get { return GetValue(DataIdCodeProperty).ToString(); } 
      set { SetValue(DataIdCodeProperty, value); } 
     } 

     public ExtendedComboBox() 
     { 
      InitializeComponent(); 
     } 
    } 

} 

回答

3

這種依賴屬性被稱爲Attached Property。這基本上是在另一個對象上使用的依賴屬性。您使用DependencyProperty.RegisterAttached來創建它們,並提供兩種獲取和設置它們的靜態方法。請參閱上面的link