Как расширить этот пример свойства зависимостей, чтобы воссоздать DockPanel.Dock = "Top" -подобное свойство зависимостей? - PullRequest
1 голос
/ 07 октября 2009

Я пытаюсь лучше понять, что такое свойства зависимостей и чем они являются , а не . Я построил приведенный ниже пример, который позволяет изменять параметры в выпадающем списке в зависимости от того, как пользователь перемещает ползунок .

При создании этого я узнал, что свойства зависимостей на самом деле не имеют ничего общего с 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();
        }
    }

}

1 Ответ

3 голосов
/ 07 октября 2009

Этот тип свойства зависимости называется Присоединенное свойство . Это в основном свойство зависимости, которое используется для другого объекта. Вы используете DependencyProperty.RegisterAttached для их создания и предоставляете два статических метода для их получения и установки. Смотрите выше ссылка .

...