Ceci est ma structure de données: et ceci est mon point de vue: p> <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 Réponses :
Vous n'avez pas montré où / comment sélectionnez MMOVIE (comment il existe dans sa vue de vie), mais
La vue de la vue dans laquelle SelectedMovie est contenue (probablement DataContext du formulaire / page contenant les commandes de la liste de liste) doit implémenter l'interface INOTIFYPROPERTYCHANGED (la vue de la lumière MVVMModelbase le fait pour vous) P> li>
La propriété sélectionnéeMOVIE doit soulever l'événement de l'état de propriété dans son setter. Si vous utilisez la lumière MVVM, ViewModelBase fournit une méthode définie pour le faire pour vous. P> LI> ol>
exemple (à l'aide de la lumière MVVM; NOTE J'ai omis beaucoup de détails à vous concentrer sur le problème de base): P>
<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 */
}
Il n'y a pas de sélectionnéeMOVIE code> dans votre MédiopviewModel code>. Vous devez ajouter un et élever l'événement CODE> Propertychanged CODE> chaque fois que cela est défini comme suggéré par @c Robinson, ou vous pouvez vous attaquer directement à la propriété SELECTEYITEMEM code> de la liste FilmsListbox Code>: <ListBox x:Name="actorsListBox" ItemsSource="{Binding SelectedItem.Actors, ElementName=actorsListBox}"
SelectedItem="{Binding SelectedActor, Mode=TwoWay}" />
Il n'y a pas de ViewModel P> sélectionnexactor code> dans votre ViewModel code>. public ObservableCollection<IMovie> Movies { get; set; } = new ObservableCollection<IMovie>();
private IMovie _selectedMovie
public IMovie SelectedMovie
{
get => _selectedMovie;
set
{
_selectedMovie = value;
RaisePropertyChanged(nameof(SelectedMovie));
}
}
Comment
sélectionnémovie.cast code> défini?@Lewstherin Désolé, il devrait y avoir
acteurs code>. Sa faute de frappe quand je copie cela pourdonc code>.Complètement incertain, mais juste par la similitude avec Winforms, il y a-t-il
selectedValue = {} code> attribut disponible? Si oui, peut valoir la peine d'essayer?Est
sélectionnéeMovie code> une propriété de la classe MovieviewModel et incendie-t-il une notification de changement de propriété?Pouvez-vous confirmer que la liste des acteurs est remplie? Votre code pourrait aller bien mais sans données! Vous avez également un datatemplate pour acteurs? Pourquoi avez-vous besoin de noms dans vos boîtes de liste?