VisualCollection 抛出超出范围的异常,绑定到 Observable 集合

swift

1个回答

写回答

AI
AI

使用 VisualCollection 抛出超出范围的异常,绑定到 Observable 集合

在开发应用程序时,我们经常需要管理可视化元素的集合。WPF 提供了 VisualCollection 类来帮助我们有效地管理这些可视化元素。然而,当我们尝试将 VisualCollection 绑定到 Observable 集合时,可能会遇到超出范围的异常。

VisualCollection 是一个特殊的集合类,用于存储可视化元素(如 UIElement 对象)。它提供了一些方便的方法来添加、删除和访问集合中的元素。然而,VisualCollection 并没有实现 INotifyCollectionChanged 接口,这意味着它不能直接绑定到 Observable 集合。

为了解决这个问题,我们可以使用 ObservableCollection 类来替代 VisualCollection。ObservableCollection 是一个实现了 INotifyCollectionChanged 接口的集合类,它能够通知绑定到它的对象集合的改变。

下面是一个简单的示例,演示了如何将 VisualCollection 绑定到 Observable 集合:

csharp

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);

}

}

}

}

在这个示例中,我们创建了一个名为 MyVisualCollection 的自定义集合类,继承自 ObservableCollection。在构造函数中,我们将 VisualCollection 对象传递给 MyVisualCollection,并订阅 CollectionChanged 事件。在事件处理程序中,我们根据集合的改变来更新 VisualCollection。

这样,我们就可以将 MyVisualCollection 绑定到 XAML 中的可视化元素集合,通过添加、删除 MyVisualCollection 中的元素来实现对 VisualCollection 的操作。

案例代码

csharp

using 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 的操作,我们可以实现可视化元素的动态添加和删除。这种方法提供了一种方便的方式来管理可视化元素,同时保持数据绑定的完整性。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号