我正在尝试复制MS Paint中颜色选择器对话框的功能。我有一个ViewModel用于具有3个属性的对话框。
问题是他们都彼此相关。当我从预定义的颜色区域中选择一种颜色时,我需要更新SelectedColor,而后者应该更新SelectorLeft和SelectorTop,以便自定义颜色区域中的选择器位于正确的位置。此外,当我在自定义颜色区域中移动选择器时,我需要更新SelectedLeft和SelectedTop,它们都应该更新SelectedColor。这些关系导致堆栈溢出。
(哈!, StackOverflow上列出的堆栈溢出问题)
我可以采取另一种方法来解决这个问题,即消除一个属性对另一个属性的依赖性。或者可以定义要绑定的不同属性?
谢谢, 马特
答案 0 :(得分:1)
一些想法:
将两个属性(Left,Top)设为只读,并将所有输入转换为第三个形式(例如新的SelectedColor)以设置新值。
将所有属性设为只读,而是使用SetXXX方法设置新值(这会导致3个属性中的一个或多个更改)。我总是建议尽可能简单地使属性具有最小的副作用 - 设置一个属性永远不应该导致类中的其他属性值发生变化。因此,SetXXX方法使副作用变得清晰,并消除了proeprties本身之间的循环引用。
答案 1 :(得分:1)
如果值与当前值相同,请不要引发属性更改事件。这应该可以防止循环。
答案 2 :(得分:0)
制作两种事件方法:
UpdateSelectColor - 选择预定义的
时的MouseClick事件方法MoveSelector - 移动选择器时