Multibinding。如何更新源的正确值?

时间:2011-02-17 07:05:14

标签: wpf vb.net xaml multibinding imultivalueconverter

我的问题如下。

我有3个文本框绑定到数据集中的3个字段。 TextBox_Rate TextBox_Hours TextBox_Salary

我需要的是 TextBox_Rate + TextBox_Hours = TextBox_Salary

我发现这可以通过使用多重绑定转换器来实现。

Multibinding如下所示:

<TextBox FontSize="14.667" HorizontalAlignment="Right" HorizontalContentAlignment="Right" Style="{StaticResource TextBoxStyle}">
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource SalaryConverter}" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" ValidatesOnExceptions="True" NotifyOnValidationError="True" NotifyOnSourceUpdated="True" StringFormat="C">
            <Binding Path="Rate Per Hour"/>
            <Binding Path="Hours Per Month"/>
        </MultiBinding>
    </TextBox.Text>
</TextBox>

转换器:

Public Class SalaryConverter
Implements IMultiValueConverter

Dim weeklyHours As Double = 0

Public Function Convert(ByVal values() As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
    Dim salary As Decimal = 0
    If values(0).Equals(System.Windows.DependencyProperty.UnsetValue) Or values(1).Equals(System.Windows.DependencyProperty.UnsetValue) Then
        Return salary
    Else
        salary = (Math.Round(values(0) * (values(1) * 4)))
        weeklyHours = values(1)
        Return salary
    End If
End Function

Public Function ConvertBack(ByVal value As Object, ByVal targetTypes() As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object() Implements System.Windows.Data.IMultiValueConverter.ConvertBack
    Dim testVal As Decimal = CType((value.ToString.Replace("R ", "").Replace(",", "") / weeklyHours), Decimal) / 4
    Return New Object() {testVal}
End Function

结束班

所有这一切100%有效。我得到了我想要的结果。但这也是问题所在的地方......

TextBox_Rate 绑定到数据集字段评分 TextBox_Hours 绑定到数据集字段小时且最初(之前)多绑定) TextBox_Salary 绑定到数据集字段薪水,但不限于 TextBox_Rate TextBox_Hours 。并且Multibinding产生的值不会更新回源字段“Salary”,因为它不受该字段的约束。

如何设置绑定以更新该字段?

先谢谢。

3 个答案:

答案 0 :(得分:0)

我的解决方案?

我只是放弃了更新正确绑定的想法。

就像转换器一样,在我需要“薪水”的任何地方,我都会使用“费率”和“小时”的组合。

似乎正在发挥作用。

答案 1 :(得分:0)

您可以添加其他绑定,例如。绑定到TextBox_Hours(单向),TextBox_Rate(单向)和数据集Salary(双向或单向源)。然后实现转换器的ConvertBack方法为数据集提供值,并为两个文本框提供Binding.DoNothing。

答案 2 :(得分:0)

或者,甚至更简单,将Salary定义为DataSet的只读计算属性。 然后,您可以将TextBoxSalary文本框绑定到此属性,完全取消转换器,从视图中删除关联的业务逻辑。

相关问题