Моя цель состоит в том, чтобы одно свойство размера обновлялось двумя разными текстовыми полями. В частности, каждый компонент, подключенный к одному текстовому полю, который подсвечен в XAML ниже. В частности, линия, которая говорит: {Binding Path = Dimensions.Width, ....}Связать отдельные компоненты одного свойства с двумя отдельными элементами управления в WPF
private Size _dimension;
public Size Dimensions
{
get { return _dimension; }
set
{
_dimension = value;
OnPropertyChanged("Dimensions");
}
}
Мой XAML выглядит следующим образом:
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
<Label Content="Width" />
<TextBox Width="50" Text="{Binding Path=Dimensions.Width,
Converter={StaticResource myStringToDoubleConverter},
UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<Label Content="Height" />
<TextBox Width="50" Text="{Binding Path=Dimensions.Height,
Converter={StaticResource myStringToDoubleConverter},
UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</StackPanel>
Проблема у меня есть функция набора не называется когда я меняю текст в текстовом поле. Я предполагаю, что причина в том, что я не поставляю объект «Размер», но в лучшем случае - двойной, а в худшем - строку. У меня есть конвертер, чтобы преобразовать строку в double, но это не похоже на трюк. Мое чувство Multibinding дает мое решение, однако все примеры, которые я видел, объединяют две строки в третий элемент управления. Я не заинтересован в контроле с добавленными значениями, а скорее в обновлении компонентов моего «сложного» свойства.
Я понимаю, что могу создать два свойства «sub», Height и Width, а затем обновить свойство Dimension за раз, но, похоже, более элегантное решение должно существовать.
Почему мое текстовое поле не связано должным образом с одним компонентом свойства Dimension и соответствующим образом обновляет размер?
Кажется излишним создать класс-оболочку, который реализует INotifyPropertyChanged.
public class MySizeClass : Size, INotifyPropertyChanged
Я думаю, что ваш ответ является разумным решением. У вашего кода в вашем исходном посте определенно есть некоторые проблемы: 1. Вы можете установить только ширину, а не высоту. 2. Как ваш конвертер преобразует ширину в размер без знания ее высоты? Как вы сохраняете высоту от предыдущего объекта размера? –
@BillZhang Конвертер фактически просто меняет String на Double, а не на размер. Чтобы преобразовать в размер, мне нужно как-то получить параметр Height. Мне непонятно, что это действительно возможно. Если мой конвертер не сделал что-то особенное, в котором он обновляет только один из двух компонентов. Что-то вроде: return (new Size (input, this.Height)), но это не особенно элегантно и, возможно, хуже ... Редактировать: Будет корректировать код в OP, чтобы быть более однородным. – mwjohnson
Это будет очевидно. Поскольку нет никакого неявного конвертера конвертирования, двойного к размеру, свойство вашего размера, безусловно, никогда не вызывается. Поскольку View Model является специальной моделью для просмотра, вы должны подумать о том, как удобный View может потреблять свою модель. –