Привязка данных WPF

Может ли кто-нибудь указать мне на хороший ресурс (или дать мне подсказку), чтобы показать мне, как выполнять привязку данных к элементам управления (ComboBox, ListBox и т. Д.) В WPF? Я немного теряюсь, когда у меня забирают все мои достоинства WinForms, и я не настолько умен, чтобы начать ...

Ответов (6)

Решение

Я считаю, что обучающие видео на Windows Client .Net одинаково хороши. Телеканал Dot Net Rocks TV также освещал это некоторое время назад.

Вот еще один хороший ресурс от MSDN: Обзор привязки данных .

в коде позади - установите DataContext в поле списка равным коллекции, к которой вы привязываетесь.

private void OnInit(object sender, EventArgs e)
{
  //myDataSet is some IEnumerable 

  // myListBox is a ListBox control.
  // Set the DataContext of the ListBox to myDataSet
  myListBox.DataContext = myDataSet;
}

В XAML Listbox может объявлять, к каким свойствам он привязывается, используя синтаксис «Binding».

<ListBox Name="myListBox" Height="200"
  ItemsSource="{Binding Path=BookTable}"
  ItemTemplate  ="{StaticResource BookItemTemplate}"/>

Лучший ресурс, который я нашел для привязки данных WPF, - это блог Беа Коста . Начните с первого поста и читайте дальше. Это круто.

И еще несколько ссылок, на случай, если вышеперечисленного не хватит:

Windows Presentation Foundation - разделы с
инструкциями по привязке данных - около 30 статей с инструкциями из MSDN.
«В этом разделе описывается, как использовать привязку данных для привязки элементов к данным из различных источников данных в форме объектов среды CLR и XML».

Шаг за шагом к привязке данных
WPF - гуру WPF Джош Смит
«В этой статье объясняются абсолютные основы привязки данных WPF. В ней показаны четыре различных способа выполнения одной и той же простой задачи. Каждая итерация приближается к наиболее компактной, Возможна реализация только для XAML. Эта статья предназначена для людей, не имеющих опыта привязки данных WPF ».

Вам нужно сделать три вещи:

  1. Свяжите ItemsSource ComboBox со списком параметров.
  2. Привяжите SelectedItem к свойству, содержащему выделение.
  3. Установите ComboBox.ItemTemplate на DataTemplate для ComboBoxItem.

Так, например, если ваш объект контекста данных - это человек, имеющий адреса электронной почты, и вы хотите выбрать его основной, у вас могут быть классы с этими подписями:

public class EmailAddress
{
    public string AddressAsString { get; set; }
}

public class Person
{
    public IEnumerable<EmailAddress> EmailAddresses { get; }
    public EmailAddress MainEmailAddress { get; set; }
}

Затем вы можете создать поле со списком следующим образом:

<ComboBox ItemsSource="{Binding EmailAddresses}" SelectedItem="{Binding MainEmailAddress}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <ComboBoxItem Content="{Binding AddressAsString}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Теперь вам нужно реализовать INotifyPropertyChanged как в Person, так и в EmailAddress. Для коллекции EmailAddresses вы можете поддержать ее с помощью ObjservableCollection.

Или в качестве альтернативы вы можете использовать Update Controls .NET . Это проект с открытым исходным кодом, который заменяет привязку данных и не требует INotifyPropertyChanged. Вы можете использовать любую имеющуюся коллекцию для поддержки свойства EmailAddresses. XAML работает так же, как указано выше, за исключением того, что вы импортируете пространство имен UpdateControls.XAML и заменяете {Binding ...} на {u: Update ...}.