ImultivalueConverter + Multibinding - обратные арифматические расчеты по значениям, связанным с данными?
-
10-10-2019 - |
Вопрос
Аполлогии для странного названия. Я не знал, как еще это выразить.
Что у меня есть, так это 3 Textboxes Data Data к некоторым значениям.
Что мне нужно сделать, так это то, что значение 1 из текстовых полей автоматически вычисляет в результате расчета других 2 текстовых полей.
После некоторого Google я обнаружил, что использование интерфейса ImultivalueConverter должно решить мою проблему. Оно делает. Но только 1 способ.
Например:
Textbox 1 * Textbox 2 = Textbox 3
Но обратное также верно:
Textbox 3 / Textbox 2 = Textbox 1
Последнее - это то, что у меня проблемы с завершением. Независимо от того, что я делаю, обратный расчет не придерживается.
Я внедрил 2 ImultivalueConverters, каждый для 2 текстовых поле (с тех пор, как 2 его различных вычисления).
Конвертер 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 ничего не устанавливаются. Это потому, что всякий раз, когда я возвращаю параметр значения, я получаю исключение, говоря, что я не могу преобразовать из строки в 1-мерный массив.
Что я делаю не так?
Буду признателен за любую оказанную помощь.
Заранее спасибо.
PS Я довольно новичок в конвертерах. Я только начал играть с этим недавно.
Решение
Многозначный конвертирование работает так:
- Метод преобразования требует n входных параметров и преобразовать его в 1 результат. В вашем случае: Textbox 1 + Textbox 2 => Textbox 3
- Convertback - это обратное: он принимает 1 входной параметр и преобразует его в n результатов. В вашем случае: Textbox 3 => Textbox 1 + Textbox 2
Таким образом, ваш Convertback должен вернуть массив, содержащий значения TextBox1 и TextBox2 ... Если вы хотите обновить только TextBox1 для Exmple, вы можете сделать:
return new object[] { myTextBox1String, Binding.DoNothing };
РЕДАКТИРОВАТЬ: Ссылка на MSDN Convertback: http://msdn.microsoft.com/en-us/library/system.windows.data.imultivelueconverter.convertback.aspx