Элемент ListBox не обновляется в WPF? - PullRequest
4 голосов
/ 25 мая 2010

У меня есть список, в котором есть несколько пунктов. При двойном щелчке по каждому элементу пользователь получает возможность редактировать элемент (текст элемента). Теперь, когда я обновляю элемент, мой элемент в списке не обновляется.

альтернативный текст http://i48.tinypic.com/dgq5ba.png

Первое окно (окно со списком) находится в файле MainWindow.xaml, а второе окно - в файле EditTaskView.xaml (который позволяет редактировать текст элементов).

Код, отображающий элементы в списках:

Main.Windows.cs

public static ObservableCollection TaskList;

    public void GetTask()
    {
        TaskList = new ObservableCollection<Task>
                           {
                               new Task("Task1"),
                               new Task("Task2"),
                               new Task("Task3"),
                               new Task("Task4")
                           };

        lstBxTask.ItemsSource = TaskList;
    }

private void lstBxTask_MouseDoubleClick (отправитель объекта, MouseButtonEventArgs e) {

        var selectedTask = (Task)lstBxTask.SelectedItem;
        EditTask.txtBxEditedText.Text = selectedTask.Taskname;
        EditTask.PreviousTaskText = selectedTask.Taskname;  
        EditTask.Visibility = Visibility.Visible;
    } 

Код xaml, отображающий список:

<ListBox x:Name="lstBxTask" Style="{StaticResource ListBoxItems}" MouseDoubleClick="lstBxTask_MouseDoubleClick">
        <ListBox.ItemTemplate>              
            <DataTemplate>                   
                <StackPanel>
                    <Rectangle Style="{StaticResource LineBetweenListBox}"/>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Taskname}"  Style="{StaticResource TextInListBox}"/>
                        <Button Name="btnDelete" Style="{StaticResource DeleteButton}" Click="btnDelete_Click"/>                                                     
                    </StackPanel>
                </StackPanel>                   
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox> 
    <ToDoTask:EditTaskView x:Name="EditTask" Grid.Row="1" Grid.RowSpan="2" Grid.ColumnSpan="2" Visibility="Collapsed"/> 

Кнопка Сохранить в TaskEditView.xaml делает это:

    public string PreviousTaskText { get; set; }

 private void btnSaveEditedText_Click(object sender, RoutedEventArgs e)
 {
            foreach (var t in MainWindow.TaskList)
            {
                if (t.Taskname == PreviousTaskText)
                {
                    t.Taskname = txtBxEditedText.Text;
                }
           }

            Visibility = Visibility.Collapsed;

 }

TaskList - это ObservableCollection, и хотя после обновления значения пользовательский интерфейс обновляется. Но, похоже, так не работает.

Что мне не хватает?

Ответы [ 3 ]

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

Важно отметить, что хотя класс ObservableCollection передает информацию об изменениях к его элементам, он не знает или заботиться об изменениях свойств его элементов. Другими словами, это не следит за изменением недвижимости уведомление о предметах в пределах его коллекция. Если вам нужно знать, если кто-то изменил свойство одного предметов в коллекции, вам нужно убедиться, что предметы в коллекции реализовать Интерфейс INotifyPropertyChanged и вам нужно будет прикрепить вручную свойство изменило обработчики событий для эти объекты

Прочитайте эту статью для получения дополнительной информации: http://msdn.microsoft.com/en-us/magazine/dd252944.aspx

Чтобы реализовать уведомление PropertyChanged, отметьте это: http://msdn.microsoft.com/en-us/library/ms743695.aspx

3 голосов
/ 25 мая 2010

Хорошо, вот рабочий код:

public class Task: INotifyPropertyChanged
    {
        //public string Taskname { get; set; }
        public event PropertyChangedEventHandler PropertyChanged;
        private string _taskname;
        public Task(string value)
        {
            this._taskname = value;
        }
        public string Taskname
        {
            get { return _taskname; }
            set
            {
                _taskname = value;
                OnPropertyChanged("Taskname");
            }
        }
        private void OnPropertyChanged(string value)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(value));
            }
        }
    }
2 голосов
/ 25 мая 2010

Похоже, вам может понадобиться реализовать INotifyPropertyChanged в вашем классе Task. Этот интерфейс предупреждает пользовательский интерфейс о том, что базовые данные изменились, и ему необходимо переполнить данные, чтобы обновить представление.

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