【问题标题】:Multibinding. How to update correct value to source?多重绑定。如何将正确的值更新为源?
【发布时间】:2011-06-28 21:37:29
【问题描述】:

我的问题如下。

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

我需要的是 TextBox_Rate + TextBox_Hours = TextBox_Salary

我发现这可以通过使用 MultibindingConverter 来实现。

多重绑定如下所示:

<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 绑定到数据集字段 RateTextBox_Hours 绑定到数据集字段 Hours 并且最初(之前多重绑定)TextBox_Salary 已绑定到数据集字段 Salary,但不会绑定到 TextBox_RateTextBox_Hours。并且从 Multibinding 生成的值不会更新回源字段“Salary”,因为它没有绑定该字段。

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

提前致谢。

【问题讨论】:

  • 您使用什么语言?我相信它是 VB.NET ......也许你应该相应地添加标签。

标签: wpf vb.net xaml multibinding imultivalueconverter


【解决方案1】:

我的解决方案?

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

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

似乎工作正常。

【讨论】:

  • 如果你总是要在任何情况下获得价值,我认为没有必要保存薪水。这也证实了您选择放弃“通过数据绑定更新工资”
【解决方案2】:

您可以添加额外的绑定,例如。绑定到 TextBox_Hours(一种方式)、TextBox_Rate(一种方式)和数据集 Salary(两种方式,或一种来源方式)。然后实现转换器的 ConvertBack 方法,为数据集和 Binding.DoNothing 提供一个值给两个文本框。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2012-09-21
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2011-07-31
      • 2018-07-21
      • 2013-12-09
      • 2014-09-20
      相关资源
      最近更新 更多