我有一个包含几个项目的列表框。双击每个项目时,用户可以选择编辑项目(项目文本)。现在,一旦我更新了项目,列表框中的项目就不会更新。
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就会被刷新。但似乎并没有这样做。
我缺少什么?
答案 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();
更新后?