MultiBinding. Как обновить правильное значение для источника? - PullRequest
0 голосов
/ 17 февраля 2011

Моя проблема заключается в следующем.

У меня есть 3 текстовых поля, связанных с 3 полями в наборе данных. TextBox_Rate , TextBox_Hours , TextBox_Salary .

Что мне нужно было для TextBox_Rate + TextBox_Hours быть = TextBox_Salary .

Я обнаружил, что это может быть достигнуто с помощью Multibinding и Converter .

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 привязано к полю набора данных Rate , TextBox_Hours привязано к полю набора данных Часы и первоначально (до мультибиндинга) TextBox_Salary был привязан к полю набора данных Зарплата , но не связан с TextBox_Rate И TextBox_Hours.И значение, полученное из Multibinding, не обновляется до исходного поля «Зарплата», поскольку оно не привязано к этому полю.

Как установить привязку для обновления этого поля?

Спасибо заAdvance.

Ответы [ 3 ]

0 голосов
/ 07 апреля 2011

Вы можете добавить дополнительную привязку, например. привязка к TextBox_Hours (в одну сторону), TextBox_Rate (в одну сторону) и окладу набора данных (в две стороны или в одну сторону к источнику) Затем реализуйте метод ConvertBack конвертера, чтобы предоставить значение для набора данных и Binding.DoNothing для обоих текстовых полей.

0 голосов
/ 19 августа 2013

Или, что еще проще, определите Salary как вычисляемое свойство DataSet только для чтения. Затем вы можете привязать текстовое поле TextBoxSalary к этому свойству, полностью отказаться от конвертера, удалив связанную бизнес-логику из вашего представления.

0 голосов
/ 21 февраля 2011

Мое решение?

Я просто отказался от идеи обновления правильной привязки.

Так же, как в конвертере, везде, где мне нужно «Зарплата», я использую комбинациюОцените »и« Часы ».

Кажется, работает.

...