#c# #wpf #mvvm #listbox
#c# #wpf #mvvm #listbox
Вопрос:
У меня есть ListBox со следующей таблицей данных:
<DataTemplate x:Key="ItemTmp">
<Border Name="Border" BorderBrush="Aqua" BorderThickness="1" Padding="5" Margin="5">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Path=Item1}"></TextBlock>
<TextBlock Grid.Column="1" Text="{Binding Path=Item2}"></TextBlock>
<TextBox Grid.Column="2" Text="{Binding Path=UpdatedGrade,UpdateSourceTrigger=LostFocus,Mode=TwoWay }" />
</Grid>
</Border>
</DataTemplate>
</UserControl.Resources>
Значит, я хочу, чтобы каждый раз, когда пользователь что-то пишет в одном из текстовых полей, он обновлял одно и то же поле в ViewModel — UpdatedGrade , проблема в том, что это не работает.
Когда я просто привязываю одно текстовое поле к этому полю, оно работает, например:
TextBox Grid.Row="3" Text="{Binding Path=UpdatedGrade,UpdateSourceTrigger=LostFocus,Mode=TwoWay }"></TextBox>
У кого-нибудь есть идеи, как я могу это сделать?
Ответ №1:
DataContext элемента ListBox относится к отдельному элементу в коллекции, поэтому он пытается найти свойство этого элемента.
Пока это не приложение из магазина Windows, вы можете сделать что-то вроде этого:
Text="{Binding Path=DataContext.UpdatedGrade, UpdateSourceTrigger=LostFocus, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl}}"
в приложениях win8 вы не можете так легко найти ancestor, поэтому вам придется указать имя элемента, который содержит контекст
Text="{Binding Path=DataContext.UpdatedGrade, UpdateSourceTrigger=LostFocus, Mode=TwoWay, ElementName=MyUserControl}"
Я не уверен, как это будет действовать — привязка непосредственно к текстовому полю — это может обновить UpdatedGrade в DataContext, но опять же, я не уверен.
Text="{Binding Path=Text, UpdateSourceTrigger=LostFocus, Mode=TwoWay, ElementName=MyTextBox}"
Комментарии:
1. Ваше первое решение вместе с тем, что я изменил с TwoWay на OneWayToSource, похоже, решает его, спасибо за быстрый ответ.