Tag: observablecollection

将整个ObservableCollection替换为另一个ObservableCollection

public class Alpha { public ObservableCollection Items { get; set; } public Alpha() { Items = new ObservableCollection(); } public void DoSomething() { Items = GetNewItems(); // whenever I do this, Items gets a new referene, // so every WPF binding (eg datagrids) are broken } public ObservableCollection GetNewItems() { var ret = new ObservableCollection(); […]

合并ObservableCollection

我有两个ObservableCollections,我需要在一个ListView控件中一起显示它们。 为此,我创建了MergedCollection,它将这两个集合显示为一个ObservableCollection。 这样我就可以将ListView.ItemsSource设置为我的合并集合,并列出两个集合。 添加工作正常,但当我尝试删除项目时,显示未处理的exception: An unhandled exception of type ‘System.InvalidOperationException’ occurred in PresentationFramework.dll Additional information: Added item does not appear at given index ‘2’. MergedCollection的代码如下: public class MergedCollection : IEnumerable, INotifyCollectionChanged { ObservableCollection nodes; ObservableCollection connections; public MergedCollection(ObservableCollection nodes, ObservableCollection connections) { this.nodes = nodes; this.connections = connections; this.nodes.CollectionChanged += new NotifyCollectionChangedEventHandler(NetworkNodes_CollectionChanged); this.connections.CollectionChanged += new […]

如何在ObservableCollection上引发CollectionChanged事件,并将更改的项目传递给它?

我有一个inheritance自ObservableCollection的类,并添加了一些其他方法,如AddRange和RemoveRange 我的基本方法调用是这样的: public void AddRange(IEnumerable collection) { foreach (var i in collection) Items.Add(i); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } 我的问题是我想访问CollectionChanged事件中的e.NewItems或e.OldItems来对CollectionChanged任何项目执行操作,并且NotifyCollectionChangedAction.Reset操作不传递这些值 void Instances_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) // e.NewItems is always null { foreach (var item in e.NewItems) { if (item is EventInstanceModel) ((EventInstanceModel)item).ParentEvent = this; } } } 所以我想我可以使用NotifyCollectionChangedAction.Add而不是Reset ,但是抛出一个Range actions are not supportedexception […]

为什么不能从不同的线程更新ObservableCollection?

在multithreadingWPF应用程序中, 无法从WPF窗口线程以外的线程更新ObservableCollection 。 我知道有解决方法 ,所以我的问题不是如何避免“ 这种类型的CollectionView不支持从不同于Dispatcher线程的线程更改其SourceCollection ”exception。 我的问题是, 为什么有这样的例外? 为什么不允许从任何线程进行集合更新? 就个人而言,当ObservableCollection从其他线程更改时,我认为没有任何理由阻止UI更新。 如果两个线程(包括并行线程)访问同一个对象,一个通过事件监听对象属性的更改,另一个执行更改,它将始终有效,至少在正确使用锁定的情况下。 那么,原因是什么?

将IList中的元素添加到ObservableCollection中

我有一个ObservableCollection,我想将IList的内容设置为这个。 现在我可以创建一个新的集合实例..: public ObservableCollection obs = new ObservableCollection(); public void Foo(IList list) { obs = new ObservableCollection(list); } 但是,我怎样才能真正获取IList的内容并将其添加到我现有的ObservableCollection中? 我是否必须遍历所有元素,还是有更好的方法? public void Foo(IList list) { foreach (var elm in list) obs.Add(elm); }

WPF对ObservableCollection进行排序会取消选择ComboBox

我有一个ComboBox,用户可以在其中选择他们正在处理的JobType。 ComboBox有一个AllJobTypes列表。 问题源于用户添加新JobType时,我将JobType添加到AllJobTypes ObservableCollection,然后对其进行排序。 当排序发生时,ComboBox被取消选择并且不确定原因。 JobConfig.SelectedJobType.Name在此过程中永远不会更改。 有没有办法对可观察的集合进行排序,而不会破坏ComboBox? public class JobTypeList : ObservableCollection { public void SortJobTypes() { var sortableList = new List(this); sortableList.Sort((x, y) => x.Name.CompareTo(y.Name)); //this works but it creates a bug in the select for JobTypes for (int i = 0; i < sortableList.Count; i++) { this.Move(this.IndexOf(sortableList[i]), i); } } 而在XAML中

ObservableCollection的反向顺序

我有包含自定义对象的ObservableCollection 。 通常,项目会在列表末尾添加 我在找什么: 从列表开头添加的项目。 这可能只在UI中显示 ,我的整个程序已经在使用此列表中的数据位置。 因此,其中的对象可能不会改变后面代码中的顺序。 此ObservableColection包含Button对象(自定义样式)。 这些按钮显示在ListBox和StackPanel内部,具有水平布局(因此按钮可以很好地放在彼此之后)。 问题: 创建的每个按钮都会收到DateTime 。 新添加的按钮始终具有更新的日期,然后是之前的按钮。 所有计算都发生在计时器内 (目前每秒运行一次)。 所以我基本上在这个时间排序,但是在突然按下3个按钮后,按钮被放置在右手侧(而不是左手侧)。 例如: Btn3:14:15:45(正确) Btn4:14: 16:00( 错误) Btn2:14:15:32(正确)Btn1:14:04:17(正确) 每次都会在列表的开头正确添加前3个按钮。 突然第四个项目被添加到第二个位置。 似乎并不总是比较时间? 每次创建一个按钮时,都会调用CollectionViewSource方法。 CollectionViewSource有问题还是有更好的方法来处理它?

如何替换静态ObservableCollection,以便它可以在MVVM方式的所有窗口上访问

Atm我得到了一个带有静态ObservableCollection的类(somerandomclasss): public static ObservableCollection thepeoplelist = new ObservableCollection(); 但是,我正在将我的项目转换为MVVM,当然这不是填充所有项目控件的好方法(主要是listviews)我有多个窗口以这种方式使用此源。 private void UserControl_Loaded(object sender, RoutedEventArgs e) { lsvallthepeople.ItemSource = somerandomclasss.thepeoplelist; } 列表视图然后显示具有该信息的所有人。 然而,这不是我打赌的MVVM方式,我没有找到一个没有公共静态ObservableCollection的好方法,但是有一个窗口,你有一个listview,你可以编辑人员,他们在SQL中更新数据库和PersonViewModel(获得INotifyPropertyChanged)。 如果您需要更多信息,请随时询问ofc :)。

集合依赖属性

我有一个自定义控件,它具有ObservableCollection类型的DependencyProperty ,它绑定到observableCollection : <MyControl MyCollectionProperty = {Binding MyObservableCollection} … 问题是添加到MyObservableCollection不会更新MyCollectionProperty 。 我需要完全替换MyObservableCollection以使其工作,例如 MyObservableCollection = null; MyObservableCollection = new ObservableCollection(){…} 有没有更好的方法来处理这个? 编辑: public ObservableCollection Columns { get { return (ObservableCollection)GetValue(ColumnsProperty); } set { SetValue(ColumnsProperty, value); } } public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register(“Columns”, typeof(ObservableCollection), typeof(MyControl), new PropertyMetadata(new ObservableCollection(), OnChanged));

XMLSerialize一个ObservableCollection

我在observable集合的xml序列化中遇到问题。 这是我序列化的内容: public enum Status { Pending, Active, Completed, Cancelled } public abstract class Entity : INotifyPropertyChanged { … } public class UserStory : Entity { public uint StoryID { get; set; } public Status Status { get; set; } … public ObservableCollection Tasks { get; set; } } public class Task : Entity { […]