防止Viewmodel属性中的StackOverFlow或递归

时间:2018-02-14 16:31:54

标签: c# wpf mvvm properties

我坚持实施“保持宽高比”功能。 让我们说你旋转/缩小宽度控制。它直接计算与w / h比率相对应的高度,反之亦然。
由于此窗口后面的代码都有valueChanged事件。每次更改值时,都会调用其相反的事件。

enter image description here


我为递归调用写了一个防止代码。

    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

1 个答案:

答案 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");
        }
    }

和高度属性类似