ObservableCollection <T>запускает событие SelectionChanged, если заполнено в конструкторе представлений - PullRequest
1 голос
/ 10 января 2012

У меня есть данные, сохраненные в IsolatedStorage в моем приложении WP7, эти данные являются ObservableCollection

Затем я загружаю данные в наблюдаемую коллекцию в приложении, которое привязывается к представлению списка с табличкой данных

Но когда я делаю это (или просто добавляю данные в список с привязкой к данным) в конструкторе, он запускает событие SelectionBox с измененным значением, поэтому, прежде чем мое приложение будет полностью загружено, это происходит.

У меня есть событие для выбора, измененное, чтобы показать подробности об объекте, по которому щелкнули, и это происходит сбой, когда это происходит (по какой-то причине 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));
    }

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Если вы хотите добавить элементы в ОК до того, как сработают какие-либо привязки, то переместите следующую строку

InitializeComponent();

после на точку, где добавляются элементы.Когда вызывается этот метод, создается весь пользовательский интерфейс и устанавливаются привязки.Вы можете щелкнуть правой кнопкой мыши и перейти к определению, чтобы увидеть, как это происходит.

1 голос
/ 10 января 2012

Я бы привязался к событию Loaded.

Используйте частный и публичный. Обратите внимание на строчные буквы для частного.

  private ObservableCollection<Note> notesCollection 

Сделать SelectedIndex общедоступным свойством и привязать к нему. Когда вы назначаете частную сторону, установите его -1;

  private int selectedIndex = -1;

По умолчанию выбранный индекс равен 0. И выбранный измененный индекс всегда срабатывает при запуске приложения. Вам просто нужно установить selectedIndex = -1 перед вызовом события.

С SelectedIndex в качестве открытого свойства я бы делал логику в наборе и даже не имел бы измененного события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...