WPF绑定TextBoxes中的数值以相对于彼此进行更改

时间:2013-08-12 20:13:03

标签: wpf data-binding textbox relative

如果其中一个TextBox值发生变化,如何绑定多个保存数值的WPF TextBox来更改相同的绝对量?

Multiple TextBoxes

假设我有上述用户界面。如果未选中CheckBox,我需要定期绑定到ViewModel属性(这是我现在拥有的):

<TextBox Text="{Binding Value1}" />
<TextBox Text="{Binding Value2}" />
<TextBox Text="{Binding Value3}" />
<TextBox Text="{Binding Value4}" />
<TextBox Text="{Binding Value5}" />
<CheckBox Content="Relative Changes Constant" IsChecked="{Binding UseRelative}" />

如果选中了CheckBox并且更改了任何TextBox中的值,我需要将所有其他TextBox值更新或向下更新相同的相对量。 例如,如果第二个TextBox值从25更新 - > 30.其他4个TextBox值应该变为39,26,30和32(增加5)。

1 个答案:

答案 0 :(得分:0)

这是一个只使用两个属性的解决方案......

  private int _value1;
    public int Value1
    {
        [DebuggerStepThrough]
        get { return _value1; }
        [DebuggerStepThrough]
        set
        {
            if (value != _value1)
            {
                if (UseRelative)
                {
                    UpdateRelative(value - _value1);
                }
                else
                {
                    _value1 = value;
                    OnPropertyChanged("Value1");
                }
            }
        }
    }
    private int _value2;
    public int Value2
    {
        [DebuggerStepThrough]
        get { return _value2; }
        [DebuggerStepThrough]
        set
        {
            if (value != _value2)
            {
                if (UseRelative)
                {
                    UpdateRelative(value - _value2)
                }
                else
                {
                    _value2 = value;
                    OnPropertyChanged("Value2");
                }
            }
        }
    }
    private void UpdateRelative(int increment)
    {
        _value1 += increment;
        _value2 += increment;
        // update the view
        OnPropertyChanged("Value1");
        OnPropertyChanged("Value2");
    }

在此示例中,在设置了支持字段之前,setter中有干预,查询UseRelative值是否为true。如果是,则setter调用UpdateRelative方法并返回。

UpdateRelative方法在支持字段上运行,一旦执行计算,它就会在 public 字段上调用OnPropertyChanged。然后,WPF绑定引擎将查询getter并更新视图(因为getter使用支持字段)。

当UseRelative为false时,它正常运行:即标准WPF属性模型。可以使用相同的技术将此示例中的两个属性扩展为包含问题中的5个。