Связать ItemsSource из SelectedItem - PullRequest
0 голосов
/ 13 марта 2019

Это моя структура данных:

public class Movie : IMovie
{
    public string Title { get; set; }
    public string Description { get; set; }
    public List<IActor> Actors { get; set; }
}

public class Actor : IActor
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

И это моя модель представления:

public class MovieViewModel : BaseViewModel
    {
        public ObservableCollection<IMovie> Movies { get; set; } = new ObservableCollection<IMovie>();

        public MovieViewModel()
        {
            foreach (var movie in blc.GetAllMovies())
                Movies.Add(movie);
        }
    }

В моем MainWindow я добавляю dataContext к этому:

this.DataContext = new MovieViewModel();

У меня есть 2 списка. Когда я выбираю фильм в первом списке, я хочу отобразить всех актеров во втором списке.

Мне удалось показать фильмы. По какой-то причине актеры не отображаются при нажатии на любой фильм.

<ListBox x:Name="moviesListBox" ItemsSource="{Binding Movies}" SelectedItem="{Binding SelectedMovie, Mode=TwoWay}" />
<ListBox x:Name="actorsListBox" ItemsSource="{Binding SelectedMovie.Actors}" SelectedItem="{Binding SelectedActor, Mode=TwoWay}" />

Что там не так?

Ответы [ 3 ]

0 голосов
/ 14 марта 2019

В вашем MovieViewModel нет свойства SelectedMovie.Вы должны добавить его и вызвать событие PropertyChanged всякий раз, когда оно установлено в соответствии с предложением @C Robinson, или вы можете напрямую связать со свойством SelectedItem moviesListBox:

<ListBox x:Name="actorsListBox" ItemsSource="{Binding SelectedItem.Actors, ElementName=actorsListBox}"
                                SelectedItem="{Binding SelectedActor, Mode=TwoWay}" />
0 голосов
/ 14 марта 2019

В вашем ViewModel.

нет свойства SelectedActor.

ViewModel

public ObservableCollection<IMovie> Movies { get; set; } = new ObservableCollection<IMovie>();

private IMovie _selectedMovie
public IMovie SelectedMovie
{
   get => _selectedMovie;
   set
   {
      _selectedMovie = value;
      RaisePropertyChanged(nameof(SelectedMovie));
   }
}

Поэтому, когда вы выберете фильм, будет вызван сеттер SelectedMovie. Там он будет вызывать событие измененного свойства для SelectedMovie, а затем пользовательский интерфейс обновит второй список.

0 голосов
/ 14 марта 2019

Вы не показали, где и как определяется SelectedMovie (как он существует в своей модели представления), но

  1. Модель представления, в которой содержится SelectedMovie (предположительно, DataContext формы /страница, содержащая элементы управления ListBox) должна реализовывать интерфейс INotifyPropertyChanged (MVVM Light ViewModelBase делает это за вас)

  2. Свойство SelectedMovie должно вызывать событие PropertyChanged в своем установщике.Если вы используете MVVM Light, ViewModelBase предоставляет метод Set для этого.

Пример (используется MVVM Light; обратите внимание, я упустил много деталей, чтобы сосредоточиться на ядревыпуск):

<Window 
    DataContext={Binding MyViewModel, Source={StaticResource Locator}}
    >
    <ListBox x:Name="moviesListBox" ItemsSource="{Binding Movies}" SelectedItem="{Binding SelectedMovie, Mode=TwoWay}" />
    <ListBox x:Name="actorsListBox" ItemsSource="{Binding SelectedMovie.Actors}" SelectedItem="{Binding SelectedActor, Mode=TwoWay}" /> 
</Window>

public MovieViewModel : ViewModelBase
{
    public ObservableCollection<IMovie> Movies { get; } = new ObservableCollection<IMovie>();

    public MovieViewModel()
    {
        foreach (var movie in blc.GetAllMovies())
            Movies.Add(movie);
    }

    private Movie _selectedMovie;
    public Movie SelectedMovie
    {
        get
        {
            return _selectedValue;
        }
        set
        {
            Set(ref _selectedValue, value);
        }
    }
}

public class ViewModelLocator
{
    // Constructor to register ViewModels, etc...
    //


    public MovieViewModel MyViewModel => /* resolve the view model */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...