C # / WPF: ListView ne met pas à jour (mais quand je vérifie avec Snoop, tout va bien)
Question
Quelqu'un sait-il pourquoi mon ListView avec le code suivant ne fonctionne pas? J'ai vérifié avec Snoop et ItemsSource semble bien fonctionner (et lorsque je lance Snoop, ListView m'affiche le MyViewModel.MyCollection, mais lors du débogage avec Visual Studio, il ne m'affiche rien?)
Merci!
PS: MainWindow.xaml.cs a le DataContext = MainViewModel
<ListView Grid.Row="1" Margin="38,50,0,168" HorizontalAlignment="Left" Name="listViewSelectDate" Width="105"
ItemsSource="{Binding Path=MyViewModel.MyCollection}"
SelectedItem="{Binding SelectedDate}" IsSynchronizedWithCurrentItem="True">
<ListView.View>
<GridView>
<GridViewColumn Header="Date" DisplayMemberBinding="{Binding Path=CalcDate}"/>
</GridView>
</ListView.View>
</ListView>
Le modèle de vue se présente comme suit:
class MainViewModel : ViewModelBase
{
public SummaryViewModel MyViewModel
{
get { return _myViewModel; }
set { _myViewModel = value; RaisePropertyChanged("MyViewModel"); }
}
public MyDate SelectedDate
{
get { return _selectedDate; }
set { _selectedDate = value; RaisePropertyChanged("SelectedDate"); }
}
}
et
public class SummaryViewModel : ViewModelBase
{
public ObservableCollection<MyDate> MyCollection { get; set; }
}
et
public class MyDate
{
public DateTime CalcDate { get; set; }
}
La solution
Qui définit MyCollection
? Il ne fournit pas de notification de modification, donc la liaison ne sait pas qu'elle a été modifiée. Changer en:
private ObservableCollection<MyDate> _myCollection;
public ObservableCollection<MyDate> MyCollection
{
get { return _myCollection; }
set
{
_myCollection = value;
OnPropertyChanged("MyCollection");
}
}
Ou, mieux encore, rendez-le en lecture seule:
private readonly ICollection<MyDate> _myCollection = new ObservableCollection<MyDate>();
public ICollection<MyDate> MyCollection
{
get { return _myCollection; }
}
Autres conseils
Dans la fenêtre de sortie de Visual Studio, vous verrez apparaître toutes les erreurs DataBinding susceptibles de vous aider à résoudre le problème.