标签: observablecollection

如何对ObservableCollection进行排序

我有一个ObservableCollection和一个WPF UserControl是Databound.Control是一个图表,显示ObservableCollection中每个BarData类型项的垂直条.

ObservableCollection<BarData>

class BarData
{
   public DateTime StartDate {get; set;}
   public double MoneySpent {get; set;}
   public double TotalMoneySpentTillThisBar {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

现在我想基于StartDate对ObservableCollection进行排序,以便BarData将在集合中按StartDate的顺序递增.然后我可以像这样计算每个BarData中TotalMoneySpentTillThisBar的值 -

var collection = new ObservableCollection<BarData>();
//add few BarData objects to collection
collection.Sort(bar => bar.StartData);    // this is ideally the kind of function I was looking for which does not exist 
double total = 0.0;
collection.ToList().ForEach(bar => {
                                     bar.TotalMoneySpentTillThisBar = total + bar.MoneySpent;
                                     total = bar.TotalMoneySpentTillThisBar; 
                                   }
                            );
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用ICollectionView对数据进行排序,过滤数据但不会改变实际的集合.我需要对实际集合进行排序,以便我可以为每个项目计算TotalMoneySpentTillThisBar.它的价值取决于集合中的项目顺序.

谢谢.

sorting wpf observablecollection icollectionview

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

无法将"MS.Internal.NamedObject"类型的对象强制转换为自定义类型

我不是WPF的新手,但我无法弄清楚这个问题:

我使用的ObservableCollection<MyCustomType>是我绑定到ComboBoxes,它像往常一样工作得很好,但在某些时候我需要更改集合的内容(我从数据库中检索一个新集合,可能包含也可能不包含旧集合的一部分) ).

现在添加或删除元素都是由WPF完成的,但是如果你改变了整个集合,我发现你必须为集合引发PropertyChanged.

问题是,有时崩溃会给我一个不太友好的例外.
我不确定究竟是什么触发了崩溃,但是如果我没有触摸View并从DB中检索新的集合,它就不会崩溃.

这是一些代码:

    public const string MyObsCollectionProperty = "MyObsCollection";
    private ObservableCollection<MyCustomType> m_MyObsCollection;
    public ObservableCollection<MyCustomType> MyObsCollection
    {
        get { return m_MyObsCollection; }
        set
        {
            m_MyObsCollection = value;
            RaisePropertyChanged(MyObsCollectionProperty); // <-- Crashes here
        }
    }
Run Code Online (Sandbox Code Playgroud)

我得到了例外: Unable to cast object of type 'MS.Internal.NamedObject' to type 'MyNameSpace.MyCustomType'

请注意,此异常来自Prism,但这可能只是因为我在ViewModel上继承了NotificationObject.

我感谢你对这个问题的任何帮助,

问候,

LK.

编辑:我认为问题来自ComboBox,更具体地说,来自我设置其属性的方式.

我将ItemsSource属性绑定到ObservableCollection,并决定选择哪个元素,我将SelectedValue绑定到ObservableCollection项的字段(ComboBox嵌套在ListView中).
我还设置了SelectedValuePath(你明白了).

我想当我改变第一个集合时,地狱破坏会在这个设置上失败.当我因为虚拟化而没有触摸视图时它会平静下来(它最初是隐藏的).

加成:

InnerException是nulll.

信息: Unable to cast object of type 'MS.Internal.NamedObject' to type 'CocoonV4.DAL.WcfServiceCocoonV4.DekoTemplate'.

   at Microsoft.Practices.Prism.Commands.DelegateCommand`1.<>c__DisplayClass6.<.ctor>b__3(Object o)
   at …
Run Code Online (Sandbox Code Playgroud)

wpf casting prism observablecollection

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

MVVM - 为ModelView实现'IsDirty'功能以保存数据

作为WPF和MVVM的新手,我在努力学习一些基本功能.

让我先解释一下我的意思,然后附上一些示例代码......

我有一个显示用户列表的屏幕,我在右侧显示所选用户的详细信息,其中包含可编辑的文本框.然后我有一个Save按钮,它是DataBound,但我只想在数据实际发生变化时显示这个按钮.即 - 我需要检查"脏数据".

我有一个完整的MVVM示例,其中我有一个名为User的模型:

namespace Test.Model
{
    class User
    {
        public string UserName { get; set; }
        public string Surname { get; set; }
        public string Firstname { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,ViewModel看起来像这样:

using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows.Input;
using Test.Model;

namespace Test.ViewModel
{
    class UserViewModel : ViewModelBase
    {
        //Private variables
        private ObservableCollection<User> _users;
        RelayCommand _userSave;

        //Properties
        public ObservableCollection<User> User
        {
            get
            {
                if (_users == null)
                {
                    _users = new ObservableCollection<User>();
                    //I assume I need this …
Run Code Online (Sandbox Code Playgroud)

c# wpf observablecollection mvvm

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

对ObservableCollection进行排序

假设我有ObservableCollection员工类

public ObservableCollection<Employee> employeeCollection = new ObservableCollection<Employee>();

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public double MobileNumber { get; set; }
    public string City { get; set; }
    public int Age { get; set; }

    public Employee() {}
}
Run Code Online (Sandbox Code Playgroud)

现在我试图ObservableCollection通过用户从组合框中进行适当的选择来对("employeeCollection")进行排序[它将... ...排序FirstName ... .Sort By MobileNumber等...]

并且需要返回已排序的可观察集合.... 意味着它不应该是"var"的形式 ObservableCollection<Employee>

所以我可以将它归还给...的“ItemsSource”财产“ItemsControl”

谢谢……

.net c# sorting wpf observablecollection

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

为什么不在WPF中使用BindingList

我也在MSDN论坛上问过这个问题... http://social.msdn.microsoft.com/Forums/en/wpf/thread/4493988a-9bd8-48fe-aff0-348502136a80

我需要知道为什么微软建议WPF中BindingList没有正确支持...

BindingList在WPF 中没有用的是什么?我发现它非常实用.到目前为止,我个人没有发现BindingList任何较慢或内存负载较多.

另外WPF ItemsControls,ItemsTemplates,Styles,Hierarchies工作的伟大与BindingList太迟了.他们同样可以观察到.

作为一个自己的核心WPF开发者和ObservableCollection粉丝,我的信念被一个曾经完成的事情所震撼BindingList....

我为什么要使用ObservableCollectionBindingList?(保留INotifyPropertyChanged,它们都必须实现项目属性更改)

wpf bindinglist observablecollection

14
推荐指数
1
解决办法
9091
查看次数

ObservableCollection元素转换/投影包装器

在WPF中创建ViewModel时,有时需要将ObservableCollection(源集合)中可用的数据转换为扩展/限制/投影原始元素(目标集合)的包装元素集合,同时元素的数量和顺序始终镜像原始集合.

就像Select扩展方法一样,除了它不断更新,因此可以用于WPF绑定.

如果在索引x处将元素添加到源,则会在目标集合中的相同索引x处添加相同元素的Wrapper.如果在源集合中删除了索引y处的元素,则会在目标集合中删除索引y处的元素.

说有一个ObservableCollection<ClassA>,但我需要绑定的是ReadOnlyObservableCollection<ClassB>(或等效的),其中ClassB- > ClassA如下:

class ClassB : INotifyPropertyChanged, IDisposable
{
    public ClassB(ClassA a)
    {
        Wrapped = a;
        (Wrapped as INotifyPropertyChanged).PropertyChanged+=WrappedChanged;
    }
    public ClassA Wrapped { get; private set; }
    public int SomeOtherProperty { get { return SomeFunction(Wrapped); }
    WrappedChanged(object s, NotifyPropertyChangedArgs a) { ... }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我可以自己写TemplatedTransformCollectionWrapper,我可以写这个:

ObservableCollection<ClassA> source;
TemplatedTransformCollectionWrapper theCollectionThatWillBeUsedInABinding
    = TemplatedTransformCollectionWrapper(source, classA => new ClassB(classA));
Run Code Online (Sandbox Code Playgroud)

TemplatedTransformCollectionWrapper理想地包装所有实现INotifyCollectionChanged并正确处理原始包装集合的所有可能的添加,删除和替换操作的集合.

TemplatedTransformCollectionWrapper正确编写并不是一件轻而易举的事情,它似乎是其他人已经做过的事情,也许它甚至是核心框架的一部分.但我找不到它.

.net c# wpf observablecollection inotifycollectionchanged

14
推荐指数
1
解决办法
1508
查看次数

将WPF Canvas子项绑定到ObservableCollection

在我的WPF应用程序中,我有一个Canvas,在其中我做了一些绘图.之前我在后面的代码中处理了绘图,但现在我已经将所有内容都考虑在了ViewModel上.这给了我一些挑战..

我有一些持有笔划的InkPresenter对象.我在后面的代码中将它们作为子项添加到Canvas中 - 像这样:

// Build an InkPresenter: 
var someInkPresenter = BuildInkPresenter(..); 
//_myCanvas is the <Canvas> I want to display it in: 
_myCanvas.Children.Add(someInkPresenter); 
Run Code Online (Sandbox Code Playgroud)

现在 - 没有在持有_myCanvas的XAML的代码隐藏中构建InkPresenter我需要以不同的方式做到这一点.我想要做的是创建一个InkPresenter并将其添加到集合中:

public ObservableCollection<InkPresenter> Drawings;
Run Code Online (Sandbox Code Playgroud)

我现在的问题是如何将Canvas绑定到此ObservableCollection - 并在添加到集合时显示InkPresenters.我能以某种方式使用数据绑定来实现这一目标吗?

.net data-binding wpf observablecollection

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

将多个ObservableCollections绑定到One ObservableCollection

有一堆,ObservableCollection<MeClass> Result并要求将它们全部组合到另一个,ObservableCollection<MeClass> AllResults所以我可以在一个显示它listview.

只是不确定如何将它们合二为一.

我创建了一个新类,将它们组合在一起但不确定在我获得列表后它们将如何更新...所以不确定要采取哪个方向.

我知道INotifyPropertyChanged我只是不确定如何将它们全部组合并随着一切变化而不断更新.

.net c# wpf observablecollection inotifypropertychanged

13
推荐指数
1
解决办法
5459
查看次数

Merged ObservableCollection

我有两个ObservableCollections,我需要在一个ListView控件中一起显示它们.为此,我创建了MergedCollection,它将这两个集合显示为一个ObservableCollection.这样我就可以将ListView.ItemsSource设置为我的合并集合,并列出两个集合.添加工作正常,但当我尝试删除项目时,显示未处理的异常:

An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll
Additional information: Added item does not appear at given index '2'.
Run Code Online (Sandbox Code Playgroud)

MergedCollection的代码如下:

public class MergedCollection : IEnumerable, INotifyCollectionChanged
{
    ObservableCollection<NetworkNode> nodes;
    ObservableCollection<NodeConnection> connections;

    public MergedCollection(ObservableCollection<NetworkNode> nodes, ObservableCollection<NodeConnection> connections)
    {
        this.nodes = nodes;
        this.connections = connections;

        this.nodes.CollectionChanged += new NotifyCollectionChangedEventHandler(NetworkNodes_CollectionChanged);
        this.connections.CollectionChanged += new NotifyCollectionChangedEventHandler(Connections_CollectionChanged);
    }

    void NetworkNodes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        CollectionChanged(this, e);
    }

    void Connections_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        CollectionChanged(this, e);
    }

    #region IEnumerable Members

    public IEnumerator GetEnumerator()
    {
        for …
Run Code Online (Sandbox Code Playgroud)

c# collections wpf merge observablecollection

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

如何在ObservableCollection中进行更改

public ObservableCollection<IndividualEntityCsidClidDetail> IncludedMembers { get; set; }
Run Code Online (Sandbox Code Playgroud)

假设我有一个参考,IncludedMembers我希望在添加/删除/编辑集合项时发生事件.

c# observablecollection

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