Свойство зависимостей ListBox - PullRequest
1 голос
/ 19 апреля 2010

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

<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");
        }
    }
}

Может кто-нибудь объяснить мне, как я смогу выполнить это, используя свойство зависимости. Каким-то образом я очень запутался с понятием свойства зависимости, и я просто хотел увидеть рабочий пример для этого.

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

Мне нравится думать о связывании данных как о старшем брате. Система Binding настраивает себя на просмотр всех своих различных зарегистрированных Bindings, и когда соответствующие критерии (например, FocusLost или PropertyChanged) выполнены, система Binding копирует исходное значение в цель. Для привязки TwoWay или OneWayToSource система Binding даже скопирует данные из целевого объекта в исходный, если найдутся правильные критерии.

Цель должна быть DependencyProperty, так как это особый вид свойства, который знает, как зависеть от других значений. XAML {Binding} делает под прикрытием создание нового BindingExpression, а затем вызывает BindingOperations.SetBinding, который регистрирует конкретное BindingExpression в Binding System, поэтому он знает, как наблюдать и выполнять обновления.

Преимущество этого состоит в том, что ни цель, ни источник не должны брать на себя ответственность за написание кода для явного обновления другого. Если у меня есть код, который знает, как предоставить список цветов, почему меня должно волновать, как цвета будут представлены пользователю? Поскольку система привязки заботится о привязке, для меня не имеет значения, является ли цель, использующая мои цвета, списком, деревом или любым другим объектом, который знает, как обрабатывать список элементов. Я могу сосредоточиться на том, что мне небезразлично (публичный интерфейс, который я раскрываю), и мне не нужно заботиться о беспорядочных деталях склеивания этого интерфейса с чем-то другим.

1 голос
/ 19 апреля 2010

Вам нужно, чтобы ваш ListBox "выделил" текущий текст:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...