首页 > 解决方案 > 当 WPF 中 ViewModel 的子属性更改时如何更新绑定

问题描述

我有好几次这个问题,但从来没有想出如何正确解决它。

我有一个对象,SensorOrientation它由一个浮点数和一个布尔值组成:

public class SensorOrientation{
    public float? RadialAngle {
        get{
            //Getting from backingField
        }
        set{
            //Setting the backingField
            //Notifying
        }
    }

    public bool IsAxial {       
        get{
            //Getting from backingField
        }
        set{
            //Setting the backingField
            //Notifying
        }
    }
}

在我的 ViewModel 中,我有一个SensorOrientation属性和另一个属性,这是一个基本 ViewModel(我有一个有 9 个位置的图表,我必须选择最接近 RadialAngle 中的自定义值的那个) .

所以我创建了一个枚举:

public enum OrientationEditorDirection
{
    Unknown,
    Center,
    Top,
    TopRight,
    Right,
    BottomRight,
    Bottom,
    BottomLeft,
    Left,
    TopLeft
}

所以在我的 ViewModel 中,我想在“RadialAngle”或“IsAxial”的值发生变化时更新它:

public class ViewModel{

    public SensorOrientation Orientation {  
        get{
            //Getting from backingField
        }
        set{
            //Setting the backingField
            //Notifying
        }
    }

    public OrientationEditorDirection Direction {
        get=> CallToTheMethodThatComputeTheCorrectDirection();
        set => CallToTheMethodThatUpdateTheSensorOrientationValue(value);
    }
}

在这个 ViewModel 的 xaml 中,我有 2 个不同的子控件,一个显示方向,一个是自定义字段,用于编辑 ? Orientation.RadialAngle(当这个人点击Center(等于 Axial)时,自定义文本框被隐藏)。

 <local:OrientationEditor SelectedDirection="{Binding Direction}"  />
 <angleEditor:AngleEditor Angle="{Binding Orientation.Angle }"/>

问题是,由于 myAngleEditor是绑定的(并且必须绑定,它在其他情况下使用),在子子属性上,我看不到何时可以提高为方向更改的属性。

到目前为止,我能做的最好的事情是在我的 ViewModel 中,当我设置一个新的“方向”时,我PropertyChanged手动注册事件,当发生变化时我更新方向。但我觉得这很丑,不是很 WPFish。

知道我怎样才能做得更好吗?

标签: c#wpfbindinginotifypropertychanged

解决方案


推荐阅读