2011-02-17 41 views
0

我的问题如下。多重绑定。如何将正确的值更新为源?

我有3个文本框绑定到数据集中的3个字段。 TextBox_RateTextBox_HoursTextBox_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势必集字段小时,最初(在multibinding前)TextBox_Salary被绑定到数据集字段工资但是您必须绑定到TextBox_Rate AND TextBox_Hours。由于不绑定该字段,因此从多重绑定生成的值不会更新回源字段“薪水”。

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

在此先感谢。

+0

你在用什么语言?我相信这是VB.NET ....也许你应该相应地添加标签。 – froeschli 2011-02-17 07:17:43

+0

添加了其他标签。 – GaaTY 2011-02-17 08:56:00

回答

0

我的解决方案?

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

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

似乎工作。

0

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

0

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