如果在视图构造函数</t>中填充,则ObservableCollection <t>将触发SelectionChanged事件

时间:2012-01-09 20:21:44

标签: c# wpf windows-phone-7

我的数据保存在我的WP7应用程序的IsolatedStorage中,这个数据是一个ObservableCollection

然后我将数据加载到应用程序中的observablecollection,该应用程序被数据绑定到带有datatemplate的listview

但是当我在构造函数中执行此操作(或者只是将数据添加到数据绑定列表)时,它会触发ListBox selectionchanged事件,因此在我的应用程序完全加载之前会发生这种情况。

我有一个selectchanged事件来显示有关被点击对象的详细信息,当发生这种情况时会崩溃(由于某种原因,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;
    }

my Selectionchanged

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

2 个答案:

答案 0 :(得分:4)

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

InitializeComponent();
在添加项目之后

。调用此方法时,将创建所有UI并设置绑定。您可以右键单击并转到定义以查看它是否正在发生。

答案 1 :(得分:1)

我会加入Loaded事件。

使用私人和公共。注意私有的小写。

  private ObservableCollection<Note> notesCollection 

使SelectedIndex成为公共属性并绑定到它。 当您指定私人侧时,将其设置为-1;

  private int selectedIndex = -1;

默认情况下,所选索引为0.并且当应用程序启动时,选定的索引更改始终会触发。您只需要在调用事件之前设置selectedIndex = -1。

使用SelectedIndex作为公共属性,我会在集合中执行逻辑,甚至没有更改事件。