WPF中的ListBox项目不会刷新?

4
我有一个列表框,其中有几个项目。当双击每个项目时,用户可以选择编辑项目(项目的文本)。现在,一旦我更新项目,我的列表框中的项目并没有得到更新。

alt text

第一个窗口(带有列表框的窗口)位于MainWindow.xaml文件中,第二个窗口位于EditTaskView.xaml文件中(允许编辑项目文本)。
显示列表项的代码如下:

Main.Windows.cs

公共静态ObservableCollection任务列表;

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

        lstBxTask.ItemsSource = TaskList;
    }

私有的void lstBxTask_MouseDoubleClick(object sender, 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,我认为一旦您更新了值,UI就会得到刷新。但似乎并不是这样的。

我错过了什么?

4个回答

4
需要注意的是,尽管ObservableCollection类会广播其元素的更改信息,但它并不知道或在意其元素属性的更改。换句话说,它不会监视其集合中的项上的属性更改通知。如果您需要知道某人是否更改了集合中某个项目的属性,则需要确保集合中的项目实现了INotifyPropertyChanged接口,并且需要为这些对象手动附加属性更改事件处理程序。
阅读此文章以获取更多信息:http://msdn.microsoft.com/en-us/magazine/dd252944.aspx 要实现PropertyChanged通知,请查看以下内容:http://msdn.microsoft.com/en-us/library/ms743695.aspx

3

好的,这里是可用的代码:

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

看起来你可能需要在Task类中实现INotifyPropertyChanged接口。该接口会向用户界面发出警报,表明底层数据已更改,并且需要重新拉取数据以更新视图。


0

到目前为止,所有的回答都非常好,仅供教育目的。 你尝试过做这个吗?

listbox.items.Refresh();

更新之后呢?


我已经尝试过了,对我很有效!非常感谢。 - smoothumut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接