0

我正在尝试在 MS Paint 中复制颜色选择器对话框的功能。我有一个具有 3 个属性的对话框的 ViewModel。

  • 公共颜色 SelectedColor
    • 这是选定的颜色
    • 我将它绑定到显示当前选定颜色的 Border 元素的背景
  • 公共双选择器左
    • 自定义颜色区域中选择器的左侧位置
    • 我将它绑定到选择器的左值。选择器是 Canvas 中的一个元素
    • 画布的 x 轴是色调
  • 公共双选择器顶部
    • 自定义颜色区域中选择器的顶部位置
    • 我将它绑定到选择器的最高值。选择器是 Canvas 中的一个元素
    • 画布的y轴是饱和度

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

(哈!StackOverflow 上列出的堆栈溢出问题)

我可以采取另一种方法来解决这个问题,消除一个属性对另一个属性的依赖。或者也许定义不同的属性来绑定?

谢谢,马特

4

3 回答 3

1

一些想法:

  • 将两个属性(左、上)设为只读,并将所有输入转换为第三种形式(例如,新的 SelectedColor)以设置新值。

  • 将所有属性设为只读,而是使用 SetXXX 方法设置新值(这会导致 3 个属性中的一个或多个发生更改)。我总是建议让属性尽可能简单,副作用最小——设置一个属性永远不会导致类中的其他属性值发生变化。因此,SetXXX 方法使副作用变得清晰,并消除了属性本身之间的循环引用。

于 2012-12-12T20:53:41.657 回答
1

如果值与当前值相同,则不要引发属性更改事件。这应该防止循环。

于 2012-12-13T14:41:36.017 回答
0

制作两个事件方法:

UpdateSelectColor - 选择预定义时的 MouseClick 事件方法

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

MoveSelector - 当你移动选择器时

  1. 更新 SelectedColor 值
  2. 更新 SelectorLeft 值
  3. 更新 SelectorTop 值
于 2012-12-12T20:53:50.860 回答