Вопрос
Может ли кто-нибудь указать мне на хороший ресурс (или дать мне подсказку), чтобы показать мне, как выполнять привязку данных к элементам управления (ComboBox, ListBox и т. д.) в WPF?Я в некоторой растерянности, когда у меня отбирают все мои тонкости WinForms, и я не такой уж и умный с самого начала...
Решение
Я нахожу обучающие видео по адресу Клиент Windows .Net одинаково здорово. Dot Net Rocks TV тоже освещал это некоторое время назад.
Другие советы
Лучший ресурс, который я нашел для привязки данных WPF, — это Блог Беа Коста.Начни с первого поста и читай дальше.Это потрясающе.
в коде позади - установите 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}"/>
И еще несколько ссылок, на случай, если приведенного выше недостаточно:
Windows Presentation Foundation — практические разделы по привязке данных
- Около 30 статей с практическими рекомендациями из MSDN.
«В темах этого раздела описывается, как использовать привязку данных для привязки элементов к данным из различных источников данных в форме объектов CLR и XML."
Переход к привязке данных WPF шаг за шагом
- От гуру WPF Джош Смит
«В этой статье объясняются абсолютные основы привязки данных WPF.Он показывает четыре разных способа выполнения одной и той же простой задачи.Каждая итерация приближается к наиболее компактной возможной реализации, использующей только XAML.Эта статья предназначена для людей, не имеющих опыта привязки данных WPF».
Вот еще один хороший ресурс от MSDN: Обзор привязки данных.
Есть три вещи, которые вам нужно сделать:
- Привяжите ItemsSource ComboBox к списку параметров.
- Привяжите SelectedItem к свойству, содержащему выделение.
- Установите для 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.
Или в качестве альтернативы вы можете использовать Обновление элементов управления .NET.Это проект с открытым исходным кодом, который заменяет привязку данных и не требует INotifyPropertyChanged.Вы можете использовать любую подходящую коллекцию для поддержки свойства EmailAddresses.XAML работает так же, как указано выше, за исключением того, что вы импортируете пространство имен UpdateControls.XAML и заменяете {Binding ...} на {u:Update ...}.