Как связать со свойствами ViewModel и свойствами элементов коллекции в ViewModel? - PullRequest
0 голосов
/ 17 августа 2011

Я постараюсь объяснить это как можно лучше ...

Я просто пытаюсь разобраться во взглядах, взглянуть на модели и докладчиков, поэтому я создал небольшую программу для иллюстрации некоторых входов и выходов. Мое небольшое приложение в основном хранит альбомы. Альбомы перечислены в поле со списком, и у меня есть поля для исполнителя, жанра и года, которые являются текстовыми полями. До сих пор проблем не было ... Я создал источник привязки и связал его с моделью представления (которая имеет свойства для названия, исполнителя, жанра и года), и она работает, как и ожидалось. Я могу прокручивать поле со списком, и различные текстовые поля будут меняться в зависимости от выбора поля со списком.

Затем я решил, что хочу добавить список песен для каждого альбома, поэтому я добавил новое свойство песен в модель представления и добавил представление сетки данных в представление. Здесь я совсем запутался. Если я привяжу источник привязки, который я использовал для всего остального, к представлению сетки данных, он, очевидно, просто хочет отобразить непосредственные поля модели представления (в основном повторяя то, что я отображаю в текстовых полях, только в формате сетки).

Если я достаточно адекватно описал проблему, что я могу сделать, чтобы отобразить поля альбома в текстовых полях и песни в виде сетки данных? Я думаю, что пришел к выводу, что мне просто нужен второй обязательный источник, но я бы хотел избежать его, если это возможно. Я попытался сделать очевидные вещи, такие как направление свойства DataMember представления сетки данных на «Songs» (имя свойства коллекции песен в модели представления), но безуспешно.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

Итак, ViewModel загружает и готовит Модели, которые представляют Альбомы, а View наблюдает за ViewModel и представляет пользователям Альбомы так, как они могут понять.

Сначала давайте посмотрим на Модель.У вас есть альбом с одной или несколькими композициями.

public sealed class Album
{
  public string Name {get;set;}
  public string Artist {get;set;}
  public IEnumerable<Song> Songs {get;set;}
}

public sealed class Song
{
  public string Name {get;set;}
  public TimeSpan Length {get;set;}
}

ViewModel загружает общедоступную коллекцию всех альбомов

public sealed class ViewModel : INotifyPropertyChanged
{
  public ObservableCollection<Album> Albums {get;set;}
  public Album SelectedAlbum {get;set;} // implement INPC for this property
}

ViewModel - это DataContext для представления.Элементы управления привязываются к альбомам и выбранному альбому.Обратите внимание, что если ViewModel не нужно воздействовать на SelectedAlbum, мы могли бы обработать текущий выбранный альбом в представлении.Это только пример.

<ComboBox 
    ItemsSource="{Binding Albums}" 
    SelectedItem="{Binding SelectedAlbum}" />

Ваши элементы управления привязываются относительно SelectedAlbum для отображения информации о нем

<TextBlock Text="{Binding SelectedAlbum.Name}" />

Ваша DataGrid привязывается к свойству Songs SelectedAlbum

<DataGrid ItemsSource="{Binding SelectedAlbum.Songs}" />

И все прошло лучше, чем ожидалось.

0 голосов
/ 17 августа 2011

Я всегда выполнял это, используя второй BindingSource, в котором первый BindingSource установлен как DataSource.

...