El elemento ListBox no se actualiza en WPF?
(3)
Es importante tener en cuenta que, aunque la clase ObservableCollection transmite información sobre los cambios a sus elementos, no conoce ni se preocupa por los cambios en las propiedades de sus elementos. En otras palabras, no vigila la notificación de cambio de propiedad en los elementos de su colección. Si necesita saber si alguien ha cambiado una propiedad de uno de los elementos de la colección, deberá asegurarse de que los elementos de la colección implementen la interfaz INotifyPropertyChanged, y deberá adjuntar manualmente gestores de eventos modificados para esos objetos
Lea este artículo para obtener más información: http://msdn.microsoft.com/en-us/magazine/dd252944.aspx
Para implementar la notificación PropertyChanged, verifique esto: http://msdn.microsoft.com/en-us/library/ms743695.aspx
Tengo un listbox que tiene un par de elementos. Cuando se hace doble clic en cada elemento, el usuario obtiene la opción para editar el elemento (texto del elemento). Ahora, una vez que actualizo el artículo, mi artículo en el cuadro de lista no se actualiza.
texto alternativo http://i48.tinypic.com/dgq5ba.png
La primera ventana (una que tiene listbox) se encuentra en el archivo MainWindow.xaml y la segunda ventana está en EditTaskView.xaml (uno de los cuales edita el archivo de los elementos).
El código que muestra los elementos en las listas es:
Main.Windows.cs
público estático 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 remitente, MouseButtonEventArgs e) {
var selectedTask = (Task)lstBxTask.SelectedItem;
EditTask.txtBxEditedText.Text = selectedTask.Taskname;
EditTask.PreviousTaskText = selectedTask.Taskname;
EditTask.Visibility = Visibility.Visible;
}
El código xaml que muestra la lista:
<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"/>
El botón Guardar en TaskEditView.xaml hace esto:
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 es ObservableCollection, y creo que una vez que actualice el valor, la UI se actualizará. Pero parece que no funciona de esa manera.
¿Qué me estoy perdiendo?
Ok aquí está el código de trabajo:
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));
}
}
}
Parece que debe implementar INotifyPropertyChanged en su clase de tarea. Esta interfaz alerta a la interfaz de usuario que los datos subyacentes han cambiado y necesita volver a copiar los datos para actualizar la vista.