IMultiValueConverter + MultiBinding - обратные арифметические вычисления для значений, связанных с данными? - PullRequest
1 голос
/ 12 января 2011

Аполлоги за странное название. Я не знал, как еще это выразить.

У меня есть 3 TextBoxes Data-Bound для некоторых значений.

Мне нужно иметь значение 1 из текстовых полей. Автоматически вычислять в результате вычисления двух других текстовых полей.

После некоторого Google'ing я обнаружил, что использование интерфейса IMultiValueConverter должно решить мою проблему. Оно делает. Но только 1 способ.

Например:

TextBox 1 * TextBox 2 = TextBox 3

Но верно и обратное:

TextBox 3 / TextBox 2 = TextBox 1

Последнее - это то, что у меня проблемы с завершением. Независимо от того, что я делаю, обратный расчет не сработает.

Я реализовал 2 IMultiValueConverters, каждый для 2 TextBox-ов (начиная с двух разных вычислений).

Конвертер 1:

Public Class SalaryConverter
Implements IMultiValueConverter

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 Double = 0
    salary = (Math.Round(values(0) * (values(1) * 4)))
    Return salary.ToString("C")
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
    Return Nothing
End Function

Конечный класс

Конвертер 2:

Public Class RateConverter
Implements IMultiValueConverter

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 rate As Double = 0
    rate = ((values(0) / values(1)) / 4)
    Return rate.ToString("C")
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
    Return Nothing
End Function

Конечный класс

Вы увидите, что для возвращаемых значений для методов ConvertBack установлено значение Nothing. Это потому, что всякий раз, когда я возвращаю параметр value, я получаю исключение, говорящее, что я не могу преобразовать строку в одномерный массив.

Что я делаю не так?

Любая помощь очень ценится.

Заранее спасибо.

P.S. Я довольно новичок в конвертерах. Я только начал играть с этим недавно.

1 Ответ

1 голос
/ 12 января 2011

Преобразование с несколькими значениями работает так:

  1. Метод Convert требует n входных параметров и преобразует его в 1 результат. В вашем случае: TextBox 1 + TextBox 2 => TextBox 3
  2. ConvertBack является обратным: он принимает 1 входной параметр и преобразует его в n результатов. В вашем случае: TextBox 3 => TextBox 1 + TextBox 2

Таким образом, ваш ConvertBack должен возвращать массив, содержащий значения TextBox1 и TextBox2 ... Если вы хотите обновить только TextBox1 для примера, вы можете сделать:

return new object[] { myTextBox1String, Binding.DoNothing };

РЕДАКТИРОВАТЬ: ссылка на MSDN ConvertBack: http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.convertback.aspx

...