Свяжите элемент с двумя источниками
В настоящее время у меня есть два текстовых поля, которые принимают любое число. У меня есть текстовый блок, который принимает введенные два числа и вычисляет среднее значение.
Мне было интересно, можно ли связать этот текстовый блок с обоими текстовыми полями и использовать собственный конвертер для вычисления среднего? В настоящее время я улавливаю текст, изменив события на обоих текстовых полях и рассчитывая среднее значение таким образом, но я полагаю, что привязка данных будет более эффективной и простой.
- Как связать WPF DataGrid с переменным числом столбцов?
- Ошибка привязки элемента ElementName
- Привязка списка в @RequestParam
- Привязка видимости кнопки к значению bool в ViewModel
- «Элемент коллекции должен быть пустым перед использованием ItemsSource».
- Связывание WPF DataGrid с DataTable с использованием TemplateColumns
- Связывание в текстовом столбце таблицы данных WPF
- WPF DataGrid: свойство CanContentScroll, вызывающее нечетное поведение
- Как форматировать столбцы DateTime в DataGridView?
- Как связать команду в WPF с обработчиком события двойного щелчка элемента управления?
- Список привязок к DataGridView в WinForm
- Связывающие элементыСвойства ComboBoxColumn в WPF DataGrid
- Ошибка WPF: не удается найти управляющий элемент FrameworkElement для целевого элемента
Вы ищете MultiBinding
.
Ваш XAML
будет выглядеть примерно так:
С разумными заменами для myConverter
, myFirst.Value
и mySecond.Value
.
Создайте конвертер, который реализует IMultiValueConverter. Это может выглядеть примерно так:
class AverageConverter : IMultiValueConverter { #region IMultiValueConverter Members public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { int total = 0; int number = 0; foreach (object o in values) { int i; bool parsed = int.TryParse(o.ToString(), out i); if (parsed) { total += i; number++; } } if (number == 0) return 0; return (total/number).ToString(); } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion }
Многозначный преобразователь получает массив объектов, по одному для каждого из привязок. Вы можете обрабатывать их, как вам нужно, в зависимости от того, собираетесь ли вы его использовать для двойного или int или любого другого.
Если два текстовых поля являются привязкой к базе данных, вы можете использовать те же привязки в многосвязном для вашего текстового блока (помня, чтобы уведомлять, когда свойство изменяется, так что ваше среднее обновление), или вы можете получить текстовое значение, обратившись к текстовым полям с помощью ElementName.
Или вы можете сделать свойство в коде позади, и привязать TextBlock к этому … Я делаю это все время, и это немного проще, чем делать конвертер, а затем делать там тот же код.
Пример: (в вашем коде позади xaml):
public double AvgValue { get { return (valueA + valueB) / 2.0; } }
И затем, в вашем XAML:
Это намного проще, чем пользовательский конвертер.
Просто добавьте шаг за шагом процедуру ответа Тимоти:
- Установите свойство View.TextBlock.Text для привязки к свойству ViewModel.AvgValue.
- Поймайте событие TextChanged элемента управления TextBox, затем установите AvgValue в обработчике события TextChanged.
- Как часть этого обработчика на шаге 2, обязательно поднимите изменение свойства, чтобы TextBlock был обновлен.