2009-10-07 2 views
1

Я пытаюсь лучше понять, какие свойства зависимостей и что они представляют не. Я построил нижеприведенный пример, который позволяет изменять варианты combobox в зависимости от того, как пользователь перемещает слайдер .Как я могу расширить этот пример свойства зависимостей, чтобы воссоздать свойство зависимостей 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> 

Code-Behind:

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.

Смежные вопросы