
AI
使用 VisualCollection 抛出超出范围的异常,绑定到 Observable 集合
在开发应用程序时,我们经常需要管理可视化元素的集合。WPF 提供了 VisualCollection 类来帮助我们有效地管理这些可视化元素。然而,当我们尝试将 VisualCollection 绑定到 Observable 集合时,可能会遇到超出范围的异常。VisualCollection 是一个特殊的集合类,用于存储可视化元素(如 UIElement 对象)。它提供了一些方便的方法来添加、删除和访问集合中的元素。然而,VisualCollection 并没有实现 INotifyCollectionChanged 接口,这意味着它不能直接绑定到 Observable 集合。为了解决这个问题,我们可以使用 ObservableCollection 类来替代 VisualCollection。ObservableCollection 是一个实现了 INotifyCollectionChanged 接口的集合类,它能够通知绑定到它的对象集合的改变。下面是一个简单的示例,演示了如何将 VisualCollection 绑定到 Observable 集合:csharppublic class MyVisualCollection : ObservableCollection<UIElement>{ private VisualCollection _visuals; public MyVisualCollection(VisualCollection visuals) { _visuals = visuals; CollectionChanged += MyVisualCollection_CollectionChanged; } private void MyVisualCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Add) { foreach (UIElement element in e.NewItems) { _visuals.Add(element); } } else if (e.Action == NotifyCollectionChangedAction.Remove) { foreach (UIElement element in e.OldItems) { _visuals.Remove(element); } } }}在这个示例中,我们创建了一个名为 MyVisualCollection 的自定义集合类,继承自 ObservableCollectioncsharpusing System.Collections.ObjectModel;using System.Collections.Specialized;using System.Windows;using System.Windows.Controls;using System.Windows.Media;namespace WpfApp{ public partial class MAInWindow : Window { private VisualCollection _visuals; private MyVisualCollection _myVisuals; public MAInWindow() { InitializeComponent(); _visuals = new VisualCollection(canvas); _myVisuals = new MyVisualCollection(_visuals); DataContext = _myVisuals; } private void AddButton_Click(object sender, RoutedEventArgs e) { _myVisuals.Add(new Ellipse { Width = 50, Height = 50, Fill = Brushes.Red }); } private void RemoveButton_Click(object sender, RoutedEventArgs e) { if (_myVisuals.Count > 0) { _myVisuals.RemoveAt(_myVisuals.Count - 1); } } } public class MyVisualCollection : ObservableCollection<UIElement> { private VisualCollection _visuals; public MyVisualCollection(VisualCollection visuals) { _visuals = visuals; CollectionChanged += MyVisualCollection_CollectionChanged; } private void MyVisualCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Add) { foreach (UIElement element in e.NewItems) { _visuals.Add(element); } } else if (e.Action == NotifyCollectionChangedAction.Remove) { foreach (UIElement element in e.OldItems) { _visuals.Remove(element); } } } }}以上是一个简单的 WPF 应用程序,其中包含一个 Canvas 控件和两个按钮。点击“Add”按钮可向 MyVisualCollection 中添加一个红色椭圆,点击“Remove”按钮可删除最后一个椭圆。通过绑定 MyVisualCollection 到 Canvas 控件的可视化元素集合,我们实现了对可视化元素的动态操作。使用 VisualCollection 抛出超出范围的异常,可以通过绑定到 Observable 集合来解决这个问题。通过创建一个自定义的集合类,继承自 ObservableCollection 并实现对 VisualCollection 的操作,我们可以实现可视化元素的动态添加和删除。这种方法提供了一种方便的方式来管理可视化元素,同时保持数据绑定的完整性。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号