Связывание WPF не обновляется до следующего действия - PullRequest
1 голос
/ 20 мая 2010

У меня есть наблюдаемая коллекция, связанная со списком в WPF. Одним из вариантов в окне является использование OpenFileDialog для добавления элемента в список с определенными свойствами. Когда я использую OpenFileDialog, он сразу устанавливает два свойства нового элемента в наблюдаемой коллекции. Я использую INotifyPropertyChanged для обновления списка. Эти два новых свойства установлены правильно, и теперь список должен отображать заголовок, содержащийся в новом свойстве заголовка, а текстовое поле заголовка, которое привязано к списку, также должно отображать новый заголовок. Однако ни один из них не отображает новый заголовок после закрытия OpenFileDialog, и когда я щелкаю по другому элементу в списке и возвращаюсь к элементу, который я только что изменил, он обновляет текстовое поле заголовка, но заголовок, отображаемый в поле списка, не изменяется до тех пор, пока я перемещаю элемент в списке, который я хочу изменить.

Вот код привязки.

ItemsSource="{Binding Path=MyData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

А вот реализация кнопки обзора, которая не работает (L1 является списком)

        private void browse_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog opf = new OpenFileDialog();
        opf.ShowDialog();
        MyData[L1.SelectedIndex].Title = System.IO.Path.GetFileNameWithoutExtension(opf.FileName);
        MyData[L1.SelectedIndex].Command = opf.FileName;
    }

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

EDIT:

Вот моя реализация INotifyPropertyChanged

 private OCLB _MyData; 
    public OCLB MyData
    { 
        get
        {
            return  _MyData;
        }

        set
        {
            _MyData= value;
            FirePropertyNotifyChanged("MyData");
        }
    }

OCLB является наблюдаемой коллекцией. Вот функция FirePropertyNotifyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    private void FirePropertyNotifyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Каждый из них находится в частичном классе MainWindow для формы wpf. У меня также есть класс для файлов MyData (с 4 функциями get / set), которые хранятся в OCLB (наблюдаемая коллекция). Существует также класс с функциями для OCLB.

1 Ответ

4 голосов
/ 20 мая 2010

Я думаю, что здесь вы видите, что ObservableCollection не запускает событие PropertyChanged для элемента в вашей коллекции. Родительская форма не получает никаких уведомлений, пока вы не прокрутите до нужного элемента.

Причина, по которой ваша новая кнопка работает, заключается в добавлении нового элемента в коллекцию, который вызывает событие CollectionChanged в ObservableCollection.

Чтобы обновить коллекцию, вам необходимо реализовать подходящий механизм изменения свойств для элементов в коллекции. Например, если вы создаете ObservableCollection<MyDataItem>, MyDataItem должен правильно реализовать INotifyPropertyChanged.

Надеюсь, это поможет,

...