С#/WPF:ListView не обновляется (но когда я проверяю с помощью Snoop, все выглядит нормально)
Вопрос
Кто-нибудь знает, почему мой ListView со следующим кодом не работает?Я проверил это с помощью Snoop, и с ItemsSource все в порядке (и когда я запускаю Snoop, ListView отображает MyViewModel.MyCollection, но при отладке с помощью Visual Studio он ничего не показывает?)
Спасибо!
ПС:MainWindow.xaml.cs имеет 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>
ViewModel выглядит следующим образом:
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"); }
}
}
и
public class SummaryViewModel : ViewModelBase
{
public ObservableCollection<MyDate> MyCollection { get; set; }
}
и
public class MyDate
{
public DateTime CalcDate { get; set; }
}
Решение
Кто устанавливает MyCollection
?Он не предоставляет уведомление об изменении, поэтому привязка не знает, что она была изменена.Изменить на:
private ObservableCollection<MyDate> _myCollection;
public ObservableCollection<MyDate> MyCollection
{
get { return _myCollection; }
set
{
_myCollection = value;
OnPropertyChanged("MyCollection");
}
}
Или, что еще лучше, сделайте его доступным только для чтения:
private readonly ICollection<MyDate> _myCollection = new ObservableCollection<MyDate>();
public ICollection<MyDate> MyCollection
{
get { return _myCollection; }
}
Другие советы
Посмотрите в окно вывода Visual Studio, оно покажет любые ошибки привязки данных, которые могут возникнуть, что может помочь вам решить проблему.