Как связать содержимое списка с выбранным элементом в текстовое поле?
У меня есть список, который привязывается к этому запросу при изменении содержимого 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 файл для полного исходного кода