我有一个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.它的价值取决于集合中的项目顺序.
谢谢.
我不是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和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) 假设我有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”
谢谢……
我也在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中创建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正确编写并不是一件轻而易举的事情,它似乎是其他人已经做过的事情,也许它甚至是核心框架的一部分.但我找不到它.
在我的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.我能以某种方式使用数据绑定来实现这一目标吗?
有一堆,ObservableCollection<MeClass> Result并要求将它们全部组合到另一个,ObservableCollection<MeClass> AllResults所以我可以在一个显示它listview.
只是不确定如何将它们合二为一.
我创建了一个新类,将它们组合在一起但不确定在我获得列表后它们将如何更新...所以不确定要采取哪个方向.
我知道INotifyPropertyChanged我只是不确定如何将它们全部组合并随着一切变化而不断更新.
我有两个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) public ObservableCollection<IndividualEntityCsidClidDetail> IncludedMembers { get; set; }
Run Code Online (Sandbox Code Playgroud)
假设我有一个参考,IncludedMembers我希望在添加/删除/编辑集合项时发生事件.
wpf ×9
c# ×6
.net ×4
sorting ×2
bindinglist ×1
casting ×1
collections ×1
data-binding ×1
merge ×1
mvvm ×1
prism ×1