当前位置: 首页 > 编程语言 > C#

使用ItemsSource填充WPF列表框-好主意?

时间:2023-04-10 11:08:15 C#

使用ItemsSource填充WPF列表框-好主意?我是一名(相对)经验丰富的Cocoa/Objective-C编码员,我正在自学C#和WPF框架。在Cocoa中,当填充NSTableView时,将委托和数据源分配给视图相对简单。然后使用这些委托/数据源方法来填充表并确定其行为。我正在组装一个包含对象列表的简单应用程序,我们称它们为Dog对象,每个对象都有一个公共字符串名称。这是Dog.ToString()的返回值。对象将显示在ListBox中,我想使用与Cocoa的NSTableViewDataSource类似的模式来填充此视图。目前似乎正在使用:publicpartialclassMainWindow:Window,IEnumerable{publicPoundpound=newPound();publicMainWindow(){InitializeComponent();狗fido=newDog();fido.name="菲多";.AddDog(fido);listBox1.ItemsSource=这个;狗点=newDog();spot.name="现货";pound.AddDog(现货);}publicIEnumeratorGetEnumerator(){返回currentContext.subjects.GetEnumerator();}System.Collections.IEnumeratorSystem.Collections.IEnumerable.GetEnumerator(){返回GetEnumerator();但我想知道这是多么正确。我在不到一个小时前安装了VisualStudio,所以可以肯定地说我不知道??自己在做什么。这是正确的模式吗?将第二项添加到列表(点)似乎可以正确更新ListBox,但我想知道是什么触发了更新?如果我在后台线程上更新Pound会怎样?我如何手动要求ListBox自行更新?(我什至需要这样做吗?)我知道我需要做的一个改变是将IEnumerable实现重构到它自己的类中,比如DogListItemsSource,但我想确保在完善之前我有一个可靠的方法。请指出我应该在评论中解决或牢记的任何其他要点,无论大小。我想第一次以正确的方式学习这一点。我的建议是创建一个Window以外的类,它负责为ListBox提供数据。一种常见的方法是WPF称为MVVM的方法,它具有任何模式的许多实现。基础知识是每个模型(例如Pound和Dog)都有一个ViewModel,负责以易于与UI交互的方式呈现模型。为帮助您入门,WPF提供了一个出色的类ObservableCollection,这是一个集合,它会在添加、移动或删除任何人时触发“HeyIChanged”事件。下面是一个例子,并不是为了教你MVVM,也没有使用MVVM的任何框架。但是,如果您设置一些断点并使用它,您将了解绑定、命令、INotifyPropertyChanged和ObservableCollection;所有这些在WPF应用程序开发中都扮演着重要的角色。从MainWindow开始,您可以将DataContext设置为ViewModel:publicclassMainWindow:Window{//...publicMainWindow(){//分配给DataContext很重要//因为UI内的所有UIElement绑定//将成为此层次结构的一部分this.DataContext=newPoundViewModel();这个.InitializeComponent();}}PoundViewModel管理DogViewModel对象集合的DogViewModel:publicclassPoundViewModel{//没有至少1个ObservableCollection的WPF应用程序是不完整的publicObservableCollectionDogs{get;私有集;}//作为从UI元素传输“动作”的一种方式,命令在WPF中发挥着重要作用publicICommandAddDogCommand{get;私有集;}publicPoundViewModel(){this.Dogs=newObservableCollection();//命令采用一个字符串参数,该参数将由UI//提供。第一种方法是执行命令//时发生的情况。第二种方法是查询什么//如果命令应该是executedthis.AddDogCommand=newDelegateCommand(name=>this.Dogs.Add(newDogViewModel{Name=name}),name=>!String.IsNullOrWhitespace(name));在您的XAML中(确保映射xmlns:local以允许XAML使用您的ViewModels):Name:当然,您需要一个DogViewModel:publicclassDogViewModel:INotifyPropertyChanged{privatestringname;publicstringName{get{returnthis.name;}设置{this.name=value;//需要提醒WPF数据发生变化//然后更新UIthis.RaisePropertyChanged("Name");}}公共事件PropertyChangedHandlerPropertyChanged;privatevoidRaisePropertyChanged(stringpropertyName){varhandler=this.PropertyChanged;如果(处理程序!=null)处理程序(这个,新的PropertyChangedEventArgs(propertyName));}}最后,您需要DelegateCommand:publicclassDelegateCommand:ICommand{privatereadonlyActionexecute;私有只读函数可以执行;公共事件EventHandlerCanExecuteChanged;公共委托命令(行动执行,FunccanExecute){if(execute==null)thrownewArgumentNullException("execute");this.execute=执行;this.canExecute=canExecute;}publicboolCanExecute(Tparameter){returnthis.canExecute!=null&&this.canExecute(parameter);}boolICommand.CanExecute(objectparameter){returnthis.CanExecute((T)parameter);}publicvoidExecute(Tparameter){this.execute(parameter);}boolICommand.Execute(objectparameter){returnthis.Execute((T)parameter);}}这个答案决不会让你掀起一个身临其境的、完全绑定的WPFUI,但希望它能让你感受到UI是如何与你的代码交互的!在WPF中,您通常只有一些集合作为ItemsSource和一个数据模板来显示项目通常这些控件仅在ItemsSource实例实现INotifyCollectionChanged时更新,也许您在ListBox检索它之前添加了该项目。什么是?除非Pound有一些线程亲和性,比如ObservableCollection,否则没关系,如果有,就需要使用dispatch。ListBox.Items.Refresh()可以做到这一点,但通常只适用于带有通知的集合。WPF大量使用数据绑定,因此如果您想学习该框架,可能会对相应的概述(以及所有其他概述)感兴趣。这就是C#学习教程:使用ItemsSource填充WPF列表框-好主意?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: