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));
    }

ObservableCollection<;T>;如果在视图构造函数中填充,则引发SelectionChange

如果您想在触发任何绑定之前将项目添加到OC,请移动以下行

InitializeComponent();

添加项目的点之后。当调用此方法时,将创建所有UI并设置绑定。您可以右键单击并转到定义以查看它的发生。

我将绑定到Loaded事件中。

使用私有和公共。注意private的小写字母。

  private ObservableCollection<Note> notesCollection 

将SelectedIndex设为公共属性并绑定到它。当您指定专用端时,将其设置为-1;

  private int selectedIndex = -1;

默认情况下,所选索引为0。当应用程序启动时,所选的索引总是会被更改。您只需要在调用事件之前将selectedIndex设置为-1。

将SelectedIndex作为公共属性时,我将执行集合中的逻辑,甚至不更改事件。