WPF ObservableCollection в xaml - PullRequest
       0

WPF ObservableCollection в xaml

2 голосов
/ 16 июня 2010

Я создал ObservableCollection в коде пользовательского элемента управления. Он создается при загрузке окна:

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        Entities db = new Entities();
        ObservableCollection<Image> _imageCollection =
       new ObservableCollection<Image>();

        IEnumerable<library> libraryQuery =
        from c in db.ElectricalLibraries

        select c;

        foreach (ElectricalLibrary c in libraryQuery)
        {
            Image finalImage = new Image();
            finalImage.Width = 80;

            BitmapImage logo = new BitmapImage();
            logo.BeginInit();
            logo.UriSource = new Uri(c.url);
            logo.EndInit();

            finalImage.Source = logo;

            _imageCollection.Add(finalImage);

        }

    }

Мне нужно получить ObservableCollection изображений, которые создаются на основе URL-адреса, сохраненного в базе данных. Но мне нужен ListView или другой ItemsControl для привязки к нему в файле XAML, например:

Но я не могу понять, как передать ObservableCollection в ItemsSource этого элемента управления. Я попытался создать класс, а затем создать экземпляр класса в файле xaml, но это не сработало. Должен ли я как-то создать статический ресурс>

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 16 июня 2010

Во-первых, ObservableCollection является локальной переменной. То, что вам нужно сделать, - это использовать его как частную глобальную переменную и предоставить его с открытым свойством. Интерфейс INotifyPropertyChanged можно использовать для автоматического обновления данных изображения при изменении самой коллекции.

В вашем XAML вам нужно установить для DataContext значение self, и вы сможете напрямую связать ваше публичное свойство с ItemsSource. Вы можете использовать ItemTemplate для отображения элементов в произвольном порядке.

Ура, Адам

Пример по запросу:

В C #:

public MyWindowClass
{
  public ObservableCollection<image> MyImageCollection
  {
     get;
     set;
  }
}

В XAML:

<UserControl
 ...
 DataContext="{Binding RelativeSource={RelativeSource Self}}">

 ...
 <ListBox ItemsSource="{Binding MyImageCollection}" ItemTemplate="*yourtemplateresource*" />
 ...

</UserControl>

Теперь причина, по которой я упомянул использование INotifyPropertyChanged, заключается в том, что если вы попробуете:

MyImageCollection = new ObservableCollection<image>();

Элементы в списке не обновляются автоматически. Однако с ObservableCollection вам не нужно реализовывать INotifyPropertyChanged для базового добавления и удаления элементов списка.

1 голос
/ 16 июня 2010

Вы должны установить DataContext из UserControl для вашей коллекции:

DataContext = _imageCollection

Вы можете сделать это с помощью метода UserControl_Loaded().

Далее вам нужносвязать ItemsSource из ListView в XAML:

<ListView ItemsSource="{Binding}"/>

{Binding} эквивалентен {Binding .}, который связывается с DataContext из UserControl.Если вам нужно «больше вещей» в вашем DataContext, вы можете вместо этого создать класс следующим образом:

class ViewModel : INotifyPropertyChanged {
  public ObservableCollection Images { get { ... } }
  ...
}

Используйте этот класс для DataContext:

DataContext = new ViewModel();

И заменитепривязка для привязки к свойству Images:

<ListView ItemsSource="{Binding Images}"/>

Затем вы можете добавить еще одно свойство к ViewModel:

class ViewModel : INotifyPropertyChanged {
  public ObservableCollection Images { get { ... } }
  public String Message { get { ... } set { ... } }
  ...
}

и связать его с элементом управления:

<TextBlock Text="{Binding Message}"/>

Не забудьте запустить событие PropertyChanged при изменении свойства Message в ViewModel.Это обновит пользовательский интерфейс, когда свойства модели представления будут изменены кодом.

...