什么是将ItemsControl绑定到数组(例如,System.Doubles )的最佳方法,同时能够将更改推回基础元素?
详细信息
我使用ItemsControl为用户提供一组垂直指南。底层VM对象提供了这些指南作为double[]的位置。我将这个数组绑定到ItemsSource,并在ItemsControl中正确定位指南(使用Transform)。到目前一切尚好。
然而,这些指南需要调整。ItemTemplate of my ItemsControl提供了一个Thumb,用户可以使用它来调整指南的位置。但是,由于基础元素是一个内部类型(一个double),所以更改不会明显地推回源(或者我错了吗?!)
我现在正朝着创建DoubleByRef类的方向前进,也就是说,它基本上是一个具有double类型的成员值的double 类(遗憾的是,这是明确的,LOL)。但我只想问问社区有没有更好的事。
发布于 2018-01-22 16:12:49
当您将ItemsSource绑定到集合(或数组)时,将为集合中的每个元素生成一个项容器。每个容器的数据上下文指向源集合中的对应元素,这意味着项目容器中的任何绑定都使用该元素作为其绑定源。当然,您可以在任何可以通过绑定源访问的值上设置双向绑定,但不能在源本身上设置双向绑定。没有办法做到这一点,因为绑定只知道元素的值;它不知道包含元素的集合。由于它不知道这个值从何而来,所以它无法取代它。实际上,对于像double[]这样的值类型集合,绑定源甚至不是数组中的相同值--它是一个装箱副本。
按照您的设想,使其工作的唯一方法是将准则值封装在一些引用类型的包装器中,比如您建议的DoubleByRef。然后,您将能够设置一个双向绑定到包装的值。
您可能还有另一个问题,即数组不支持集合更改通知。如果您的值总是固定的,这对您来说可能不是问题,您只需绑定到DoubleByRef[]即可。但是,如果可以添加或删除值,则需要将值包装在实现INotifyCollectionChanged的集合中。一个ObservableCollection<DoubleByRef>就行了。
有趣的是,WPF确实包括一个DoubleCollection,但它并没有真正解决元素绑定问题,也没有实现更改通知。你想猜猜它是干什么用的吗?是的-指引!
https://stackoverflow.com/questions/48385681
复制相似问题