संपादित में CollectionViewSource स्रोत बदलने: मैं सिर्फ 3 फ़ाइलों MainWindow.xaml, MainWindow.xaml.cs, और MainWindowViewModel.cs ( नीचे सूचीबद्ध) के साथ एक नई VS2010 WPF appilication बनाया। अगर कोई वास्तव में सहायक महसूस करता है तो आप सेकंड में समस्या को दोबारा बना सकते हैं (कॉपी/पेस्ट)। जब आप ऐप चलाते हैं तो डेटाग्रिड स्ट्रिंग "ओल्डकोलेक्शन" प्रदर्शित करेगा जो गलत है। यदि आप MyCollection में आइटम्ससोर्स बाइंडिंग को बदलते हैं तो यह "न्यूकॉलेक्शन" प्रदर्शित करता है जो सही है।एक MVVM दुनिया
पूर्ण विवरण: सबसे पहले मेरे डेटासोर्स के साथ MyCollection के साथ डेटाग्रिड था। मुझे एक विधि अद्यतन चयन की आवश्यकता है जो MyCollection में एक नया ObservableCollection <> असाइन करता है। MyCollection को UI अद्यतनों के लिए NotifyPropertyChange के अतिरिक्त के साथ।
अगला समूहकरण को सक्षम करने के लिए संग्रहव्यूसोर्स पेश करना आवश्यक हो गया। UI को MyCollectionView से बाध्य करने के साथ, अपडेट कोलेक्शन पर कॉल का कोई प्रभाव नहीं पड़ता है। डीबगर पुष्टि करता है कि MyCollectionView में हमेशा प्रारंभिक MyCollection शामिल है। मैं अपने न्यूकोलेक्शन को दृश्य में प्रतिबिंबित करने के लिए कैसे प्राप्त कर सकता हूं? मैंने View.Refresh(), बाइंडिंग संग्रहव्यूसोर्स, और अनगिनत अन्य रणनीतियों का प्रयास किया है।
नोट: मुख्य रूप से अन्य संग्रह आइटम में परिवर्तन से संबंधित हैं, ताज़ा कॉल किए बिना दृश्य (समूह/सॉर्टिंग) को अपडेट नहीं करते हैं। मेरी समस्या यह है कि मैं CollectionViewSource पर एक नया संग्रह संग्रहीत कर रहा हूं और दृश्य/यूआई कभी नहीं बदलता है।
// 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; }
}
}
धन्यवाद,
यह समस्या इतनी निराशाजनक है कि मैंने प्रश्न संपादित किया (संपादित अनुभाग देखें) ताकि कोई भी सेकंड को इस मुद्दे को पुन: उत्पन्न कर सके। आपके सुझाव के अनुसार मैंने उपरोक्त कोड पर संग्रह ViewSource बाध्यकारी जोड़ा, लेकिन इसका कोई प्रभाव नहीं पड़ा। – aidesigner