#wpf #mvvm #properties #binding
#wpf #mvvm #свойства #обязательный
Вопрос:
у меня есть текстовое поле, текст которого привязан к listview selecteditem следующим образом:
<TextBox x:Name="txtAdditional" Width="300" Text="{Binding ElementName=lstPersons, Path=SelectedItem.Additional, Mode=OneWay}" />
Теперь мне нравится реализовывать механизм добавления новых элементов в listview, используя это текстовое поле для получения фактических данных. Поэтому я хотел бы привязать текст текстового поля к свойству viewmodel, чтобы оно могло быть обработано командой.
Таким образом, текст textboxes должен быть привязан к listviews selecteditem и дополнительно к свойству моей viewmodel.
Я поискал вокруг и нашел несколько подходов, но я не могу отделаться от мысли, что должен быть какой-то более простой механизм для архивирования этой цели.
То, что я уже нашел:
- Использование MultiBindung с каким-то ValueConverter? Поэтому мне кажется, что это основное для отображения, а не для обновления свойства viewmodels.
- Использование какого-то самостоятельного пользовательского элемента управления?
- Использование BindingProxy с in- и out-dependencyproperties, как в Impossible WPF, часть 1: Свойства привязки?
Есть ли другое, более простое решение для этого, или мне придется использовать одно из вышеперечисленных? И если кто-то должен использовать один из этих подходов, какой из них вы бы выбрали?
Я не могу отделаться от мысли, что над этим вопросом еще не задумывались, используя шаблон mvvm?! 😉
Комментарии:
1. Вы должны добавить свойство, например,
SelectedPerson
к вашей модели представления. Используйте это свойство в качестве источника привязки для каждого элемента управления, где это необходимо. Например, привязать его кListView.SelectedItem
и кTextBox.Text
. Вы всегда должны рассматривать модель представления как единственный источник данных, а не какой-либо другой элемент управления. Данные всегда передаются между control <—> view model, но «никогда» control <—> control. Сначала так думать становится легче.
Ответ №1:
да, благодаря подсказке от BionicCode.
Нам, или, лучше, мне, следовало бы продумать концепцию MVVM. Конечно, нет — или, по крайней мере, как можно меньше кода.
Я добавил свойство «selectedPerson» в свою viewmodel и привязал SelectedItem listview к этому свойству. Таким образом, свойства, связанные с объектом, были доступны непосредственно через «выбранный» объект в моей viewmodel, и больше не было необходимости вообще обращаться к содержимому текстового поля.
Спасибо BionicCode за подсказку!