我坚持实施“保持宽高比”功能。
让我们说你旋转/缩小宽度控制。它直接计算与w / h比率相对应的高度,反之亦然。
由于此窗口后面的代码都有valueChanged事件。每次更改值时,都会调用其相反的事件。
我为递归调用写了一个防止代码。
private int m_ImageSizeY;
public int ImageSizeY
{
get { return m_ImageSizeY; }
set { m_ImageSizeY = value;
OnPropertyChanged("ImageSizeY");
}
}
// ... ImageSizeX exists too
每个VM属性都使用Mode Oneway绑定到UI。这是ViewModel中的属性代码。
1. OnChangedPixelWValue function called
2. ViewModel ImageSizeY property-setter called
3. OnPropertyChanged(string propertyName) function called
4. OnChangedPixelHValue function called
...
事件功能代码看起来很脏,但我正在尝试每种方法来防止它。
也许我不完全了解MVVM逻辑或遗漏某些东西。
如下所示调用堆栈
class Robot(object):
def __init__(self, room, position):
self.position=position
self.room=room
self.direction=random.randrange(0,360)
class DuckRobot(Robot):
def move(self,position2)
self.position=self.position + position2
return self.position
以下是我调查过的其他问题,但这对我没有帮助。
Preventing StackOverFlow in recursive functions
How to avoid property recursion
How to prevent recursion
答案 0 :(得分:2)
正确的解决方案需要您实现命令而不是使用事件。 事件是纯粹的UI事物,因此不应(在所有好的情况下)在ViewModel上处理
考虑一个场景,你想要插入另一个不触发事件的控件,那么你的代码就不会工作。
处理情境的另一种更好的方法是使用这些控件绑定属性,一旦更改了高度,它应该更新Width的局部变量,并为两个属性调用NotifyProeprtyChange
,反之亦然。
public int Width
{
get
{
return _width;
}
set
{
_width = value;
_height = YOUR CALCULATED VALUE
**All other bits you want to do here**
OnPropertyChanged("Width");
OnPropertyChanged("Height");
}
}
和高度属性类似