我的数据保存在我的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));
}
答案 0 :(得分:4)
如果要在任何绑定可能触发之前将项目添加到OC,请移动以下行
InitializeComponent();
在添加项目之后。调用此方法时,将创建所有UI并设置绑定。您可以右键单击并转到定义以查看它是否正在发生。
答案 1 :(得分:1)
我会加入Loaded事件。
使用私人和公共。注意私有的小写。
private ObservableCollection<Note> notesCollection
使SelectedIndex成为公共属性并绑定到它。 当您指定私人侧时,将其设置为-1;
private int selectedIndex = -1;
默认情况下,所选索引为0.并且当应用程序启动时,选定的索引更改始终会触发。您只需要在调用事件之前设置selectedIndex = -1。
使用SelectedIndex作为公共属性,我会在集合中执行逻辑,甚至没有更改事件。