将ItemsControl
绑定到System.Double
s数组的最佳方法是什么,同时能够将更改推回到底层元素?
我正在使用ItemsControl
为用户提供一组垂直指南。底层VM对象将这些指南的位置提供为double[]
。我将此数组绑定到ItemsSource
,并在ItemsControl
(使用Transform
)中正确定位我的向导。到目前为止一切都很好。
但是,这些指南需要调整。我ItemTemplate
的{{1}}提供ItemsControl
,用户可以使用该Thumb
调整指南的位置。但是,由于底层元素是内在类型(double
),因此更改不会明显回到源(或者我错了吗?!)
我现在正朝着创建 DoubleByRef 类的方向前进,即基本上是double
类,成员值< / strong>类型double
(很清楚,很清楚,LOL)。但只是想与社区核实是否有更好的东西。
答案 0 :(得分:2)
将cshtml
绑定到集合(或数组)时,会为集合中的每个元素生成项容器。每个容器的数据上下文指向源集合中的相应元素,这意味着item容器中的任何绑定都使用该元素作为其绑定源。虽然您可以在任何可通过绑定源访问的值上设置双向绑定,但您无法在源本身上设置双向绑定。没有办法做到这一点,因为绑定只知道元素的值;它对包含该元素的集合一无所知。由于它不知道该值来自何处,因此无法替换它。实际上,对于像ItemsSource
这样的值类型的集合,绑定源甚至不是数组中的相同的值 - 它是一个盒装副本。
使你的设想成功的唯一方法是将指南值包装在一些引用类型的包装器中,就像你提出的double[]
一样。然后,您将能够设置与包装值的双向绑定。
您可能还有另一个问题,即阵列不支持集合更改通知。如果您的值的数量始终是固定的,这对您来说可能不是问题,您只需绑定到DoubleByRef
即可。
但是,如果可以添加或删除值,则需要将值包装在实现DoubleByRef[]
的集合中。 INotifyCollectionChanged
可以使用。
另外,WPF确实包含ObservableCollection<DoubleByRef>
,但它实际上并没有解决元素绑定问题,也没有实现更改通知。你想知道它用于什么吗?是的,指导!