Как привязать все элементы ListBox к одному и тому же свойству?

#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, похоже, решает его, спасибо за быстрый ответ.