首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双向绑定到基本数据类型数组。

双向绑定到基本数据类型数组。
EN

Stack Overflow用户
提问于 2018-01-22 16:02:21
回答 1查看 712关注 0票数 4

什么是将ItemsControl绑定到数组(例如,System.Doubles )的最佳方法,同时能够将更改推回基础元素?

详细信息

我使用ItemsControl为用户提供一组垂直指南。底层VM对象提供了这些指南作为double[]的位置。我将这个数组绑定到ItemsSource,并在ItemsControl中正确定位指南(使用Transform)。到目前一切尚好。

然而,这些指南需要调整。ItemTemplate of my ItemsControl提供了一个Thumb,用户可以使用它来调整指南的位置。但是,由于基础元素是一个内部类型(一个double),所以更改不会明显地推回源(或者我错了吗?!)

我现在正朝着创建DoubleByRef类的方向前进,也就是说,它基本上是一个具有double类型的成员double (遗憾的是,这是明确的,LOL)。但我只想问问社区有没有更好的事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-22 16:12:49

当您将ItemsSource绑定到集合(或数组)时,将为集合中的每个元素生成一个项容器。每个容器的数据上下文指向源集合中的对应元素,这意味着项目容器中的任何绑定都使用该元素作为其绑定源。当然,您可以在任何可以通过绑定源访问的值上设置双向绑定,但不能在源本身上设置双向绑定。没有办法做到这一点,因为绑定只知道元素的值;它不知道包含元素的集合。由于它不知道这个值从何而来,所以它无法取代它。实际上,对于像double[]这样的值类型集合,绑定源甚至不是数组中的相同值--它是一个装箱副本。

按照您的设想,使其工作的唯一方法是将准则值封装在一些引用类型的包装器中,比如您建议的DoubleByRef。然后,您将能够设置一个双向绑定到包装的值。

您可能还有另一个问题,即数组不支持集合更改通知。如果您的值总是固定的,这对您来说可能不是问题,您只需绑定到DoubleByRef[]即可。但是,如果可以添加或删除值,则需要将值包装在实现INotifyCollectionChanged的集合中。一个ObservableCollection<DoubleByRef>就行了。

有趣的是,WPF确实包括一个DoubleCollection,但它并没有真正解决元素绑定问题,也没有实现更改通知。你想猜猜它是干什么用的吗?是的-指引!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48385681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档