循环物业参考

时间:2012-12-12 20:43:39

标签: c# wpf xaml

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

  • public Color SelectedColor
    • 这是所选颜色
    • 我将其绑定到显示当前所选颜色的Border元素的背景
  • public double SelectorLeft
    • 选择器在自定义颜色区域中的左侧位置
    • 我将它绑定到选择器的左侧值。选择器是Canvas中的元素
    • 画布的x轴是色调
  • public double SelectorTop
    • 自定义颜色区域中选择器的顶部位置
    • 我将它绑定到选择器的最高值。选择器是Canvas中的元素
    • 画布的y轴是饱和度

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

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

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

谢谢, 马特

3 个答案:

答案 0 :(得分:1)

一些想法:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

制作两种事件方法:

UpdateSelectColor - 选择预定义的

时的MouseClick事件方法
  1. 更新SelectedColor值
  2. 更新SelectorLeft值
  3. 更新SelectorTop值
  4. MoveSelector - 移动选择器时

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