2012-12-12 71 views
0

我试图在MS Paint中复制颜色选择器对话框的功能。我有一个ViewModel有3个属性的对话框。圆形属性参考

  • 公共颜色SelectedColor
    • 这是所选择的颜色
    • 我结合这对显示当前所选颜色
  • 公共双SelectorLeft边框元件的背景
    • 选择器在自定义颜色区域的左侧位置
    • 我将它绑定到选择器的左值。选择器是一个Canvas
    • 画布的x轴是色调内的元素
  • 公共双SelectorTop
    • 在自定义颜色区域中的选择器的顶部位置
    • 我结合这个给选择器的最高值。选择器是一个Canvas
    • 中的元素画布的Y轴是饱和

的问题是,他们都彼此相关。当我从预定义的颜色区域选择一种颜色时,我需要更新SelectedColor,这反过来应该更新SelectorLeft和SelectorTop,以便自定义颜色区域中的选择器位于正确的位置。另外,当我在自定义颜色区域中移动选择器时,我需要更新SelectedLeft和SelectedTop,它们都应该更新SelectedColor。这些关系导致堆栈溢出。

(哈!,在计算器上列出的堆栈溢出的问题)

有另一种方法,我可以解决这个,消除一个属性上的其他的依赖。或者可能定义不同的属性来绑定?

谢谢, 马特

回答

1

一些想法:

  • 使两个属性(左,上)只读的,并且所有的输入转换为第三形式(例如新SelectedColor)以创造新的价值。

  • 使所有属性为只读,并改为使用SetXXX方法设置新值(这会导致3个属性中的一个或多个属性发生更改)。我总是建议尽可能简单地制作属性,但副作用最小 - 设置一个属性不应该导致课程中的其他属性值发生变化。所以一个SetXXX方法使副作用清晰,并消除了proeprties之间的循环引用。

+0

听起来不错,我会试试看。 –

0

做了两个事件的方法:

UpdateSelectColor - 鼠标点击事件方法,当你选择预先设定的

  1. 更新SelectedColor值
  2. 更新SelectorLeft值
  3. 更新SelectorTop值

MoveSelector - 当你移动选择

  1. 更新SelectedColor值
  2. 更新SelectorLeft值
  3. 更新SelectorTop值
1

不要抬起属性更改事件如果值是一样的当前值。这应该防止循环。