ObservableCollection我班上有一个.进一步进入我的课程,我有一个主题.从这个线程我想添加到我的ObservableCollection.但我不能这样做:
这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection.
请注意,这不是从UI线程发生的,因此我无权访问调度程序.
我已经在StackOverflow和其他博客上阅读了关于在何处实现INotifyPropertyChanged的一些争论,但似乎有些情况下你必须在Model上实现它.这是我的情景 - 我正在寻找关于我的结论的反馈或我的方法是错误的.
我正在使用ObservableDictionary(ObservableDictionary)的这个实现,因为我需要使用密钥进行高性能的查询.
在这本词典中,我放置了Model对象的集合.
在我的VM中,我声明了一个字典的实例(Books),并在XAML中绑定它.
<tk:DataGrid AutoGenerateColumns="False" Grid.Row="1" ItemsSource="{Binding Mode=TwoWay, Path=Books.Store}" Grid.ColumnSpan="2" Margin="3">
<tk:DataGrid.Columns>
<tk:DataGridTextColumn Binding="{Binding Mode=TwoWay, Path=Value.Name}" MinWidth="100" Header="Name" />
<tk:DataGridTextColumn Binding="{Binding Mode=TwoWay, Path=Value.Details}" MinWidth="300" Header="Details" />
</tk:DataGrid.Columns>
</tk:DataGrid>
Run Code Online (Sandbox Code Playgroud)
如果我在VM for Books上实现INotifyPropertyChanged并在代码中更改Book名称的值,则不会更新UI.
如果我在VM for Store上实现INotifyPropertyChanged并在代码中更改Book名称的值,则不会更新UI.
如果我在Model上实现INotifyProperyChanged并在代码中更改Book名称的值,则更新UI.
在第一种情况下不会触发Changed事件,因为未调用Dictionary setter,它的Item(a Book)是.
我错过了什么,因为如果这是正确的解释,如果我想要我的模型的一致通知,无论它们是直接来自XAML还是通过某种集合,我总是希望模型实现INotifyProperyChanged.
顺便说一句,除了dll参考,我个人没有看到INotifyPropertyChanged作为UI函数 - 认为它应该在更通用的.net命名空间中定义 - 我的2美分.
编辑在这里开始:
我们有一个很好的语义辩论,我错过了我的问题的核心,所以这里再次发布,但有一个非常简单的MVVM示例说明我的问题.
型号:
public class Book
{
public string Title { get; set; )
public List<Author> Authors { get; set; }
}
public class Author
{
public string Name { get; …Run Code Online (Sandbox Code Playgroud) data-binding wpf observablecollection mvvm inotifypropertychanged
我知道WPF datagrid有"RowEditEnding"事件,但是我需要在Row调试之后触发事件,以检查新添加的行是否重复并合并重复的行.我的datagrid将"CanUserAddRow"属性设置为True.
我正在使用EntityObservableCollection扩展ObservableCollection以使我的实体与集合同步.所以,我考虑过OnCollectionChanged事件,但是一旦用户点击新项目占位符行,就会引发"InsertItem"事件,这意味着该对象仍然是空的,我无法检查是否有重复.
反正我是否可以举起RowEditEnded活动?
谢谢...
我有一个ObservableCollection项目绑定到我的视图中的列表控件.
我有一种情况需要在集合的开头添加一大块值.
Collection<T>.Insertdocumentation将每个插入指定为O(n)操作,每个插入也生成一个CollectionChanged通知.
因此,我理想地希望在一次移动中插入整个范围的项目,这意味着只有一个基础列表的随机播放,并且希望有一个CollectionChanged通知(可能是"重置").
Collection<T>不公开任何执行此操作的方法.List<T>有InsertRange(),但是IList<T>,这Collection<T>暴露了通过其Items属性不会.
有没有办法做到这一点?
将TabControl的项绑定到ObservableCollection的最简单示例是什么?
每个标签的内容都有唯一的数据,实际上这些数据会将自己的observableCollections绑定到items组件.
目前我有一个用户控件,我想在创建后立即将其设置为每个选项卡的内容.我还需要在创建选项卡时动态设置此新用户控件的datacontext.所以,基本上,我希望tabcontrol的observablecollection包含映射到每个选项卡中的数据的模型视图.
最重要的是,我需要在不违反WPF中的MVVM的情况下完成所有这些操作!有帮助吗?
非常感激!
我有一个继承自的类,ObservableCollection并添加了一些其他方法,如AddRange和RemoveRange
我的基本方法调用是这样的:
public void AddRange(IEnumerable<T> collection)
{
foreach (var i in collection) Items.Add(i);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我想要访问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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我认为我可以使用NotifyCollectionChangedAction.Add而不是Reset,但是会引发Range actions are not supported异常
public void AddRange(IEnumerable<T> collection)
{
var addedItems …Run Code Online (Sandbox Code Playgroud) ObservableCollection为每个对它们执行的操作发出通知.首先,他们没有批量添加或删除调用,其次他们不是线程安全的.
这不会让他们变慢吗?我们有更快的选择吗?有人说ICollectionView缠得ObservableCollection很快?这种说法有多正确.
一次又一次我发现自己必须编写BindingList和ObservableCollection的线程安全版本,因为当绑定到UI时,不能从多个线程更改这些控件.我想要了解的是为什么会出现这种情况 - 是设计错误还是故意这种行为?
请有人能够向我解释一下该BlockReentrancy方法的目的是ObservableCollection<T>什么?
MSDN以下面的示例显示:
//The typical usage is to wrap an OnCollectionChanged call within a using scope, as in the following example:
using (BlockReentrancy())
{
// OnCollectionChanged call
}
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有为我澄清目的是什么.有人在乎解释吗?
我有一个ObservableCollection,我可以添加和删除集合中的项目.但我无法替换集合中的现有项目.有一种方法可以替换项目并将其反映在我的绑定组件上.
System.Collections.Specialized.NotifyCollectionChangedAction.Replace
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我如何做到这一点?
wpf ×7
c# ×5
.net ×2
collections ×2
data-binding ×2
mvvm ×2
binding ×1
bindinglist ×1
events ×1
insert ×1
performance ×1
replace ×1
tabcontrol ×1
wpfdatagrid ×1