使用MethodToValueConverter时更新数据绑定

时间:2014-09-23 14:34:42

标签: c# wpf xaml mvvm data-binding

我有一个使用this答案中MethodToValueConverter的数据绑定。这很好用,但是在方法结果发生变化后,我很难强制视图更新。这有点难以解释,所以希望一些代码snippits会有所帮助。

班级对象

[DataContract]
public class RetentionBankItem : INotifyPropertyChanged
{
    #region Private Properties
    public event PropertyChangedEventHandler PropertyChanged;
    private float _rbRevisedRateLoad;
    private float _rbCurrentRateLoad;
    #endregion

    [DataMember]
    public float rbRevisedRateLoad
    {
        get
        {
            return _rbRevisedRateLoad;
        }
        set
        {
            PropertyChanged.ChangeAndNotify(ref _rbRevisedRateLoad, value, () => rbRevisedRateLoad);
            OnPropertyChanged("RateLoadDifference");
        }
    }

    [DataMember]
    public float rbCurrentRateLoad
    {
        get
        {
            return _rbCurrentRateLoad;
        }
        set
        {
            PropertyChanged.ChangeAndNotify(ref _rbCurrentRateLoad, value, () => rbCurrentRateLoad);
            OnPropertyChanged("RateLoadDifference");
        }
    }

    public float RateLoadDifference()
    {
        if (rbCurrentRateLoad != 0)
        {
            return rbRevisedRateLoad / rbCurrentRateLoad;
        }
        return 0;
    }
}

应注意,在以下代码中,RetentionBank的类型为List<RetentionBankItem>

我的绑定看起来像这样:

<ItemsControl ItemsSource="{Binding RetentionBank}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding rbRevisedRateLoad, Mode=TwoWay}"
                     Grid.Row="2"
                     Grid.Column="0" />

            <TextBox Text="{Binding rbCurrentRateLoad, Mode=TwoWay}"
                     Grid.Row="2"
                     Grid.Column="1" />

            <TextBox Text="{Binding Path=., Converter={StaticResource ConverterMethodToValue}, ConverterParameter='RateLoadDifference', Mode=OneWay}"
                     Grid.Row="2"
                     Grid.Column="2" />
         </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

当前和修订的费率加载正确设置,但在设置后,RateLoadDifference永远不会被调用来更新。我想,类对象本身需要被调用来更新,因为这就是文本框实际绑定的内容(不一定是方法本身),但我不确定如何做到这一点,或者它是否是正确的方法它。任何帮助或建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

将RateLoadDifference更改为属性:

public float RateLoadDifference
{
    get
    {
        if (rbCurrentRateLoad != 0)
        {
            return rbRevisedRateLoad / rbCurrentRateLoad;
        }

        return 0;
    }
}

然后将绑定更改为

Binding="{Binding Path=RateLoadDifference, Mode=OneWay}"