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

У меня есть список, который привязывается к этому запросу при изменении содержимого TextName:

var players =
    from p in context.Player
    where p.GivenName.StartsWith(TextName.Text.Trim())
    select p;

listNames.ItemsSource = players.ToList();

Здесь отображаются имена игроков, начинающиеся с текста в текстовом поле. Теперь, когда я нажимаю на любой элемент (имя) из списка, мне нужно, чтобы в TextName указывалось имя игрока, которое было выбрано в списке. Я попытался связать его так:

<TextBox ... Text="{Binding Source=listNames, Path=SelectedItem.Content}" ... />

Но когда я нажимаю ListboxItem, текстовое поле просто очищается и ничего не показывает. Возможно, мне нужно настроить текстовое поле, как я, со списком при настройке DisplayMemeberPath???? Мне нужен только один способ привязки! Что я могу сделать?

Ответ 1

У вас есть 2 проблемы с привязкой:

  • Вы используете свойство Source вместо ElementName, чтобы указать имя поля списка
  • Вы пытаетесь связать свойство Content, которое (я предполагаю) не существует на вашем объекте Player. Это происходит потому, что свойство SelectedItem для ListBox является экземпляром Player, когда вы указываете ItemsSource, как у вас

Чтобы решить эту проблему, вы должны изменить свою привязку к следующему:

<TextBox ... Text="{Binding ElementName=listNames, Path=SelectedItem.GivenName}" ... />

Ответ 2

<TextBox ... Text="{Binding ElementName=listNames, Path=SelectedItem.Name}" ... />

Это связывает TextBox.Text со списком ListBoxes - listNames - SelectedItem, который содержит объекты Player, и вам нужно его свойство Name.

Ответ 3

Вы должны использовать RelativeSource для доступа к ListBox, например:

  <TextBox ... Text="{Binding RelativeSource={RelativeSource
                      AncestorType={x:Type ListBox}}, Path=SelectedItem.Content}" .... />

Ответ 4

        <Page
        x:Class="Studentt1.MainPage"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:local="using:Studentt1"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          mc:Ignorable="d">

             <Grid Background="Wheat">
            <ListBox x:Name="listBox1" ItemsSource="{Binding StudentsList}" 
             SelectedItem="Binding SelectedStud,Mode=TwoWay}"         
             DisplayMemberPath="StudName"    
    HorizontalAlignment="Left" Height="332" Margin="59,173,0,0" VerticalAlignment="Top"                                                                
    <Button Content="Load" Command="{Binding LoadCommand}" HorizontalAlignment="Left" 
    Margin="144,567,0,0" VerticalAlignment="Top"/>

            <Grid  Background="Brown" HorizontalAlignment="Left" Height="352"   
             VerticalAlignment="Top" Width="633">  
             <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="347"/>
            <ColumnDefinition Width="401"/>
            <ColumnDefinition Width="367*"/>
            <ColumnDefinition Width="251*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="0"  FontSize="30" Grid.Column="0" Text="Registration 
        Number" HorizontalAlignment="Center" Margin="46,0,25,0" Width="276"/>
        <TextBox Grid.Row="0" Grid.Column="1"  Text="{Binding 
        ElementName=listBox1,Path=SelectedItem.RegNo,Mode=TwoWay}"/>
        <TextBlock Grid.Row="1" Grid.Column="0" FontSize="30" Text="Name"  
        HorizontalAlignment="Center" Margin="144,0,124,0" Width="79"/>
        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding  
        ElementName=listBox1,Path=SelectedItem.StudName,Mode=TwoWay}"/>
        <TextBlock Grid.Row="2" Grid.Column="0" FontSize="30" Text="Age" 
        HorizontalAlignment="Center" Margin="157,0,137,0" Width="53"/>
        <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding 
        ElementName=listBox1,Path=SelectedItem.Age,Mode=TwoWay}"/>
       </Grid>


      </Grid>
      </Page>

здесь я привязываю выделенный элемент списка к текстовому полю.

вы можете найти zip файл для полного исходного кода