Editado: he creado una nueva appilication VS2010 WPF con sólo 3 archivos MainWindow.xaml, MainWindow.xaml.cs, y MainWindowViewModel.cs (se indican a continuación). Si alguien se siente realmente útil, puede recrear el problema en segundos (copiar/pegar). Cuando ejecutas la aplicación, DataGrid mostrará la cadena "OldCollection", que es incorrecta. Si cambia el enlace ItemsSource a MyCollection, muestra "NewCollection" que es correcto.Cambio CollectionViewSource Fuente en un mundo MVVM
Descripción completa: Al principio tenía un DataGrid con su ItemsSource vinculado a MyCollection. Tengo/necesito un método UpdateCollection que asigna un nuevo ObservableCollection <> a MyCollection. Con la adición de NotifyPropertyChange a MyCollection las actualizaciones de la interfaz de usuario.
A continuación, se hizo necesario introducir un CollectionViewSource para habilitar la agrupación. Con la interfaz de usuario vinculada a MyCollectionView, las llamadas a UpdateCollection ahora no tienen ningún efecto. El depurador confirma que MyCollectionView siempre contiene la MyCollection inicial. ¿Cómo puedo hacer que mi NewCollection se refleje en la Vista? He intentado View.Refresh(), binding CollectionViewSource, y un sinnúmero de otras estrategias.
Nota: Principalmente, otros se preocupan por los cambios en los elementos de la Colección que no actualizan la vista (agrupación/clasificación) sin llamar a Refresh. Mi problema es que estoy asignando una nueva colección a CollectionViewSource y la vista/UI nunca cambia.
// MainWindow.xaml
<Window x:Class="CollectionView.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid Name="grid" ItemsSource="{Binding MyCollectionView}" />
</Grid>
</Window>
//MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
namespace CollectionView
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
}
}
}
//MainWindowViewModel.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections.ObjectModel;
using System.Windows.Data;
using System.ComponentModel;
namespace CollectionView
{
class MainWindowViewModel : INotifyPropertyChanged
{
public MainWindowViewModel()
{
MyCollection = new ObservableCollection<MyObject>() { new MyObject() { TestString = "OldCollection" } };
MyCollectionViewSource = new CollectionViewSource();
// Bind CollectionViewSource.Source to MyCollection
Binding MyBind = new Binding() { Source = MyCollection };
BindingOperations.SetBinding(MyCollectionViewSource, CollectionViewSource.SourceProperty, MyBind);
// The DataGrid is bound to this ICollectionView
MyCollectionView = MyCollectionViewSource.View;
// This assignment here to demonstrate that View/UI does not update to show "NewCollection"
MyCollection = new ObservableCollection<MyObject>() { new MyObject() { TestString = "NewCollection" } };
}
// Collection Property
// NotifyPropertyChanged added specifically to notify of MyCollection re-assignment
ObservableCollection<MyObject> _MyCollection;
public ObservableCollection<MyObject> MyCollection
{
get { return _MyCollection; }
set
{
if (value != _MyCollection)
{
_MyCollection = value;
NotifyPropertyChanged("MyCollection");
}
}
}
public CollectionViewSource MyCollectionViewSource { get; private set; }
public ICollectionView MyCollectionView { get; private set; }
// Method updates MyCollection itself (Called via ICommand from another ViewModel)
public void UpdateCollection(ObservableCollection<MyObject> NewCollection)
{
MyCollection = NewCollection;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
class MyObject
{
public string TestString { get; set; }
}
}
Gracias,
Este problema es tan frustrante que edité la pregunta (Consulte la sección Editado) para que cualquiera pueda reproducir el problema en segundos. Según su sugerencia, agregué el enlace CollectionViewSource al código anterior, pero no tuvo ningún efecto. – aidesigner