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

ListBox使用MVVM滚动到视图中分享

时间:2023-04-10 16:31:20 C#

C#学习教程:使用MVVM将列表框滚动到视图中我有一个绑定到ObservableCollection的ListBox。我运行一个进程,将一堆项目添加到集合中,以便它们显示在列表框中。问题是,当项目被添加到列表框时......滚动条只是增长,但我似乎无法弄清楚如何将它添加到ScrollIntoView集合中的每个项目。这个示例代码完美地说明了这个问题。XAML查看模型namespaceStack{usingSystem;使用System.Collections.ObjectModel;使用System.ComponentModel;使用System.Linq;使用System.Windows.Input;使用GalaSoft.MvvmLight.Command;//////TODO:更新摘要。///publicclassMainWindowViewModel:INotifyPropertyChanged{privatereadonlyBackgroundWorker_worker;私有ICommand_commandName;私有ObservableCollection_myValue=newObservableCollection();//////初始化类的新实例。///publicMainWindowViewModel(){this._worker=newBackgroundWorker();this._worker.DoWork+=newDoWorkEventHandler(DoWork);this._worker.ProgressChanged+=newProgressChangedEventHandler(ProgressChanged);this._worker.RunWorkerCompleted+=delegate(objectsender,RunWorkerCompletedEventArgse){CommandManager.InvalidateRequerySuggested();};}//////当属性值改变时发生。///公共事件PropertyChangedEventHandlerPropertyChanged;p公共ICommandCommandName{get{if(this._commandName==null){this._commandName=newRelayCommand(()=>this.CommandMethod());}返回这个._commandName;}}//////获取或设置我的值。//////我的价值。publicObservableCollectionMyValue{get{returnthis._myValue;}设置{this._myValue=value;this.NotifyPropertyChange("MyValue");}}//////通知属性更改。//////道具名称。internalvoidNotifyPropertyChange(stringpropName){if(this.PropertyChanged!=null){this.PropertyChanged(this,newPropertyChangedEventArgs(propName));}}//////命令方法。///privatevoidCommandMethod(){this.MyValue.Clear();这个._worker.RunWorkerAsync();this._worker.WorkerReportsProgress=true;}//////完成工作。//////发件人。///包含事件数据的实例。privatevoidDoWork(objectsender,DoWorkEventArgse){this.Populate();}//////填充此实例。///隐私tevoidPopulate(){for(intindex=0;index<100;index++){System.Threading.Thread.Sleep(10);this._worker.ReportProgress(index);}}//////进行更改。//////发件人。///包含事件数据的实例。privatevoidProgressChanged(objectsender,ProgressChangedEventArgse){this.MyValue.Add(e.ProgressPercentage.ToString());您可以创建一个DependencyProperty或只是扩展ListBox控件并使用您的新控件公共类ScrollingListBox:ListBox{if(newItemCount>0)this.ScrollIntoView(e.NewItems[newItem1]Count;-base.OnItemsChanged(e);}}在你的XAML中,添加类的命名空间:xmlns:custom="clr-namespace:ScrollingListBoxNamespace"并将你的标准ListBox替换为你的自定义ListBox:你还可以添加Behavior:xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"。每个人都有用,需要进一步了解C#学习教程,希望大家多多关注——usingSystem.Windows.Interactivity;publicclassScrollIntoViewBehavior:Behavior{protectedoverridevoidOnAttached(){ListBoxlistBox=AssociatedObject;((INotifyCollectionChanged)listBox.Items).CollectionChanged+=OnListBox_CollectionChanged;}protectedoverridevoidOnDetaching(){ListBoxlistBox=AssociatedObject;((INotifyCollectionChanged)listBox.Items).CollectionChanged-=OnListBox_CollectionChanged;}privatevoidOnListBox_CollectionChanged(objectsender,NotifyCollectionChangedEventArgse){ListBoxlistBox=AssociatedObject;if(e.Action==NotifyCollectionChangedAction.Add){//将新项目滚动到视图listBox.ScrollIntems[e.New0]);}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: