标签: observablecollection

ObservableCollection和线程

ObservableCollection我班上有一个.进一步进入我的课程,我有一个主题.从这个线程我想添加到我的ObservableCollection.但我不能这样做:

这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection.

请注意,这不是从UI线程发生的,因此我无权访问调度程序.

c# wpf multithreading observablecollection

29
推荐指数
3
解决办法
3万
查看次数

WPF MVVM INotifyPropertyChanged实现 - 模型或ViewModel

我已经在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

29
推荐指数
3
解决办法
6万
查看次数

WPF Datagrid行编辑"ENDED"事件

我知道WPF datagrid有"RowEditEnding"事件,但是我需要在Row调试之后触发事件,以检查新添加的行是否重复并合并重复的行.我的datagrid将"CanUserAddRow"属性设置为True.

我正在使用EntityObservableCollection扩展ObservableCollection以使我的实体与集合同步.所以,我考虑过OnCollectionChanged事件,但是一旦用户点击新项目占位符行,就会引发"InsertItem"事件,这意味着该对象仍然是空的,我无法检查是否有重复.

反正我是否可以举起RowEditEnded活动?

谢谢...

wpf observablecollection wpfdatagrid

28
推荐指数
3
解决办法
2万
查看次数

有效地向ObservableCollection添加一系列值

我有一个ObservableCollection项目绑定到我的视图中的列表控件.

我有一种情况需要在集合的开头添加一大块值. Collection<T>.Insertdocumentation将每个插入指定为O(n)操作,每个插入也生成一个CollectionChanged通知.

因此,我理想地希望在一次移动中插入整个范围的项目,这意味着只有一个基础列表的随机播放,并且希望有一个CollectionChanged通知(可能是"重置").

Collection<T>不公开任何执行此操作的方法.List<T>InsertRange(),但是IList<T>,这Collection<T>暴露了通过其Items属性不会.

有没有办法做到这一点?

c# collections performance insert observablecollection

28
推荐指数
2
解决办法
2万
查看次数

如何将TabControl的项绑定到wpf中的可观察集合?

将TabControl的项绑定到ObservableCollection的最简单示例是什么?

每个标签的内容都有唯一的数据,实际上这些数据会将自己的observableCollections绑定到items组件.

目前我有一个用户控件,我想在创建后立即将其设置为每个选项卡的内容.我还需要在创建选项卡时动态设置此新用户控件的datacontext.所以,基本上,我希望tabcontrol的observablecollection包含映射到每个选项卡中的数据的模型视图.

最重要的是,我需要在不违反WPF中的MVVM的情况下完成所有这些操作!有帮助吗?

非常感激!

data-binding wpf tabcontrol observablecollection mvvm

27
推荐指数
1
解决办法
1万
查看次数

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

我有一个继承自的类,ObservableCollection并添加了一些其他方法,如AddRangeRemoveRange

我的基本方法调用是这样的:

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.OldItemsCollectionChanged事件中对集合中的任何项目执行操作,并且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)

c# wpf observablecollection inotifycollectionchanged

26
推荐指数
2
解决办法
4万
查看次数

快速执行和线程安全的可观察集合

ObservableCollection为每个对它们执行的操作发出通知.首先,他们没有批量添加或删除调用,其次他们不是线程安全的.

这不会让他们变慢吗?我们有更快的选择吗?有人说ICollectionView缠得ObservableCollection很快?这种说法有多正确.

wpf observablecollection thread-safety icollectionview

26
推荐指数
2
解决办法
2万
查看次数

为什么BindingList或ObservableCollection这样的类不是线程安全的?

一次又一次我发现自己必须编写BindingList和ObservableCollection的线程安全版本,因为当绑定到UI时,不能从多个线程更改这些控件.我想要了解的是为什么会出现这种情况 - 是设计错误还是故意这种行为?

.net c# bindinglist observablecollection thread-safety

24
推荐指数
3
解决办法
9823
查看次数

ObservableCollection中的BlockReentrancy <T>

请有人能够向我解释一下该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)

但这似乎并没有为我澄清目的是什么.有人在乎解释吗?

.net c# collections events observablecollection

24
推荐指数
2
解决办法
5763
查看次数

Observable Collection替换项目

我有一个ObservableCollection,我可以添加和删除集合中的项目.但我无法替换集合中的现有项目.有一种方法可以替换项目并将其反映在我的绑定组件上.

System.Collections.Specialized.NotifyCollectionChangedAction.Replace
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我如何做到这一点?

wpf binding replace observablecollection

24
推荐指数
2
解决办法
2万
查看次数