2012-04-30 2 views
1

Я создал пользовательский элемент управления в wpf, который состоит из текстового поля и списка. Теперь я хочу привязать объект класса к представлению списка из формы, где я буду использовать этот элемент управления. Итак, в основном я хочу динамически установить привязку для listview.Объект класса привязки к списку в wpf

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

ответ

5

Вам необходимо связать свой ListViewItemsSource с коллекцией экземпляров вашего класса (я рекомендую использовать ObservableCollection для этого). Например, вы можете поместить коллекцию в ListView's DataContext. Тогда привязка будет просто

<ListView ItemsSource={Binding} .../> 

Это более полезно, чтобы создать класс, чтобы содержать эту коллекцию вместе с другими предметами, которые ваш UserControl могут потребовать и передавать экземпляр этого класса UserControl «s DataContext. Это относится к рисунку MVVM.

EDIT

Вы можете установить DataContext либо в коде, сзади или в XAML. Скажем, у нас есть класс с коллекцией:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     Products = new ObservableCollection<Product>() 
     { 
      new Product("book"), 
      new Product("chair"), 
      new Product("table"), 
      new Product("bookshelf"), 
     } 
    } 

    ObservableCollection<Product> Products { get; set; } 
} 

Вот как установить DataContext UserControl в коде:

userControl.DataContext = new ViewModel(); 

где UserControl является экземпляром вашего UserControl.

Вот как это сделать в в XAML:

<UserControl ... 
      xmlns:vm="namespace_containing_class_ViewModel"> 
    <UserControl.DataContext> 
     <!-- Following line instantiates the ViewModel class and calls its parameterless constructor --> 
     <vm:ViewModel /> 
    </UserControl.DataContext> 

    ... 
    <ListView ItemsSource="{Binding Products}"/> 
    ... 
</UserControl> 

Оба варианта делают то же самое. Обратите внимание, что ItemsSource="{Binding Products}" означает, что для свойства Binding.Path установлено значение «Продукты», и этот путь будет искать в DataContext ListView. Если DataContext ListView явно не задан (как в вышеупомянутом случае), DataContext совпадает с DataContext родителя. Если родительский DataContext не установлен, то он совпадает с DataContext родительского родителя и так далее. Поэтому в этом случае DataContext ListView аналогичен DataContext UserControl и является экземпляром класса ViewModel, который содержит коллекцию продуктов. Та-да! :)

+0

Можете ли вы указать пример кода для установки DataContext. Как только DataContext установлен, будет ли ItemsSource = {Binding} позаботиться о привязке? – Harsh

+0

см. Мое редактирование – EvAlex

+0

Большое спасибо @EvAlex. :) – Harsh

Смежные вопросы