ObservableCollection<;T>;如果在视图构造函数中填充,则引发SelectionChange
本文关键字:填充 SelectionChange 视图 lt gt 如果 ObservableCollection 构造函数 | 更新日期: 2023-09-27 18:19:54
我的WP7应用程序中的IsolatedStorage中保存了数据,该数据是ObservableCollection
然后,我将数据加载到应用程序中的ObservaleCollection中,该应用程序通过数据模板数据绑定到列表视图
但是,当我在构造函数中执行此操作(或者只是将数据添加到数据绑定列表中)时,它会触发ListBox selectionchanged事件,因此在我的应用程序完全加载之前,就会发生这种情况。
我有一个用于selectionchanged的事件来显示有关单击对象的详细信息,当这种情况发生时,它会崩溃(由于某种原因,Selectedindex为0,因此加载列表中的对象1在加载时会自动选择)
public partial class MainPage : INotifyPropertyChanged
{
public ObservableCollection<Note> NotesCollection { get; set; }
public CollectionViewSource NotesViewSource;
private readonly IsolatedStorageSettings settings;
// Constructor
public MainPage()
{
InitializeComponent();
NotesCollection = new ObservableCollection<Note>();
settings = IsolatedStorageSettings.ApplicationSettings;
if (settings.Contains("Notes"))
{
NotesCollection = (ObservableCollection<Note>)settings["Notes"];
}
else
{
settings.Add("Notes", NotesCollection);
}
NotesViewSource.View.Refresh();
//var note = new Note("hej", "hej", DateTime.Now, DateTime.Now);
//NotesCollection.Add(note); this also fires the event
NotesViewSource = new CollectionViewSource { Source = NotesCollection };
DataContext = this;
ListBoxNotes.ItemsSource = NotesViewSource.View;
}
我的选择已更改
private void ListBoxNotesSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (ListBoxNotes.SelectedIndex == -1)
return;
var note = ListBoxNotes.SelectedItem as Note;
if (!(note is Note)) return;
(Application.Current as App).Note = note;
ListBoxNotes.SelectedIndex = -1;
NavigationService.Navigate(new Uri("/Views/DetailsView.xaml", UriKind.Relative));
}
如果您想在触发任何绑定之前将项目添加到OC,请移动以下行
InitializeComponent();
在添加项目的点之后。当调用此方法时,将创建所有UI并设置绑定。您可以右键单击并转到定义以查看它的发生。
我将绑定到Loaded事件中。
使用私有和公共。注意private的小写字母。
private ObservableCollection<Note> notesCollection
将SelectedIndex设为公共属性并绑定到它。当您指定专用端时,将其设置为-1;
private int selectedIndex = -1;
默认情况下,所选索引为0。当应用程序启动时,所选的索引总是会被更改。您只需要在调用事件之前将selectedIndex设置为-1。
将SelectedIndex作为公共属性时,我将执行集合中的逻辑,甚至不更改事件。