WPF Databinding

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

Ответ 1

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

Ответ 2

Лучший ресурс, который я нашел для привязки данных WPF, - блог Bea Costa. Начните с первого сообщения и прочитайте вперед. Это потрясающе.

Ответ 3

в коде позади - установите 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 может объявлять, какие свойства он связывает с использованием синтаксиса "Связывание".

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

Ответ 4

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

Windows Presentation Foundation - Практические советы по привязке данных
- Около 30 статей "Как" из MSDN.
Темы в этом разделе описывают, как использовать привязку данных для привязки элементов к данным из разных источников данных в виде объектов CLR и XML.

Переход к привязке данных WPF за один шаг за шагом
- Гуру WPF Джош Смит
"В этой статье объясняются абсолютные основы привязки данных WPF.Она показывает четыре разных способа выполнения одной и той же простой задачи: каждая итерация приближается к самой компактной реализации XAML. Эта статья предназначена для людей без опыта работы в WPF привязка данных".

Ответ 6

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

  • Привязать 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.

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