ListBox项目在WPF中没有刷新?

时间:2010-05-25 03:31:16

标签: wpf listbox

我有一个包含几个项目的列表框。双击每个项目时,用户可以选择编辑项目(项目文本)。现在,一旦我更新了项目,列表框中的项目就不会更新。

alt text http://i48.tinypic.com/dgq5ba.png

第一个窗口(一个有listbox的窗口)在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(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 个答案:

答案 0 :(得分:4)

  

重要的是要注意尽管   ObservableCollection类   广播有关变化的信息   它的元素,它不知道或   关心属性的变化   它的元素。换句话说,它   不关注财产变化   关于其内部项目的通知   采集。如果你需要知道是否   有人改变了一个人的财产   该系列中的物品,   你需要确保这些物品   在集合中实现   INotifyPropertyChanged接口,和   你需要手动附加   财产改变了事件处理程序   那些对象

阅读本文以获取更多信息:http://msdn.microsoft.com/en-us/magazine/dd252944.aspx

要实施PropertyChanged通知,请检查以下内容:http://msdn.microsoft.com/en-us/library/ms743695.aspx

答案 1 :(得分: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 :(得分:2)

看起来您可能需要在Task类中实现INotifyPropertyChanged。此接口警告UI底层数据已更改,并且需要重新生成数据以更新视图。

答案 3 :(得分:0)

到目前为止,仅出于教育目的,所有答案都非常好。 您是否尝试过

listbox.items.Refresh();

更新后?