2010-05-25 89 views
4

我有一個列表框中有幾個項目。當雙擊每個項目時,用戶可以選擇編輯項目(項目文本)。現在,一旦我更新該項目,我的項目在列表框不會得到更新。ListBox項無法在WPF中刷新?

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

的第一個窗口(其中一個具有列表框)是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; 
    } 

私人無效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,我雖然一旦更新了UI的值就刷新了。但似乎沒有這樣工作。

我失去了什麼?

回答

2

看起來您可能需要在Task類中實現INotifyPropertyChanged。此界面提醒用戶界面基礎數據已更改,並且需要重新提交數據以更新視圖。

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)); 
      } 
     } 
    } 
+0

+1您是一名快速學習者。 – Amsakanna 2010-05-25 05:30:44

4

需要注意的是,雖然 關於修改 其元素的ObservableCollection類 廣播信息,它不知道或 在乎的變化是非常重要的到其元素的屬性 。換句話說,它 不注意財產變更 其 收集項目的通知。如果你需要知道,如果有人 已經改變的集合中的項目之一 屬性, 你需要確保集合中的項目 實現 INotifyPropertyChanged接口,以及 你需要手動附加 屬性更改事件處理程序 這些對象

閱讀這篇文章,以獲得更多信息:http://msdn.microsoft.com/en-us/magazine/dd252944.aspx

要實現的PropertyChanged通知檢查:http://msdn.microsoft.com/en-us/library/ms743695.aspx