我是WPF的新手。在我的示例应用程序中,我使用ListView来显示属性的内容。我不知道如何将ListView中的SelectedItem绑定到属性,然后绑定到TextBlock。
Window.xaml
<Window x:Class="Exec.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Main window" Height="446" Width="475" >
<Grid>
<ListView Name="ListViewPersonDetails" Margin="15,12,29,196" ItemsSource="{Binding Persons}" SelectedItem="{Binding CurrentSelectedPerson}">
<ListView.View>
<GridView>
<GridViewColumn Header="First name" DisplayMemberBinding="{Binding FirstName}"/>
<GridViewColumn Header="Last name" DisplayMemberBinding="{Binding LastName}"/>
<GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}"/>
</GridView>
</ListView.View>
</ListView>
<TextBlock Height="23" Name="textFirstNameBlock" FontSize="12" Margin="97,240,155,144">
<Run Text="Name: " />
<Run Text="{Binding CurrentSelectedPerson.FirstName}" FontWeight="Bold" />
</TextBlock>
<TextBlock Height="23" Name="textLastNameBlock" FontSize="12" Margin="97,263,155,121">
<Run Text="Branch: " />
<Run Text="{Binding CurrentSelectedPerson.LastName}" FontWeight="Bold" />
</TextBlock>
<TextBlock Height="23" Name="textAddressBlock" FontSize="12" Margin="0,281,155,103" HorizontalAlignment="Right" Width="138">
<Run Text="City: " />
<Run Text="{Binding CurrentSelectedPerson.Address}" FontWeight="Bold" />
</TextBlock>
</Grid>
</Window>
MainWindow.xaml.cs
Tman manager = new Tman();
private List<Person> persons;
public List<Person> Persons
{
get
{
return this.persons;
}
set
{
if (value != null)
{
this.persons = value;
}
}
}
private Person currentSelectedPerson;
public Person CurrentSelectedPerson
{
get
{
return currentSelectedPerson;
}
set
{
this.currentSelectedPerson = value;
}
}
private void Window_Loaded(object sender, RoutedEventArgs e){
ListViewPersonDetails.ItemsSource= manager.GetPersons();
}
Person.cs
class Person
{
public string FirstName
{
get;
set;
}
public string LastName
{
get;
set;
}
public string Address
{
get;
set;
}
}
感谢您的帮助。
答案 0 :(得分:8)
private void Window_Loaded(object sender, RoutedEventArgs e){
ListViewPersonDetails.ItemsSource= manager.GetPersons();
}
这可能是您的问题,您不必像这样设置itemssource。只需用这条线替换......
this.DataContext = this;
这是将属性绑定到UI的内容,因此所有这些绑定语句都有任何意义。
此外,您需要更新文本块上的绑定,以实际匹配Person类中属性的名称。
<TextBlock Height="23" Name="textFirstNameBlock" FontSize="12" Margin="97,240,155,144">
<Run Text="Name: " />
<Run Text="{Binding CurrentSelectedPerson.FirstName}" FontWeight="Bold" />
</TextBlock>
<TextBlock Height="23" Name="textLastNameBlock" FontSize="12" Margin="97,263,155,121">
<Run Text="Branch: " />
<Run Text="{Binding CurrentSelectedPerson.LastName}" FontWeight="Bold" />
</TextBlock>
<TextBlock Height="23" Name="textAddressBlock" FontSize="12" Margin="0,281,155,103" HorizontalAlignment="Right" Width="138">
<Run Text="City: " />
<Run Text="{Binding CurrentSelectedPerson.Address}" FontWeight="Bold" />
</TextBlock>
编辑:
在VS中测试,你还需要一个小东西,在CurrentSelectedPerson属性上实现INotifyPropertyChanged ......
private Person currentSelectedPerson;
public Person CurrentSelectedPerson
{
get { return currentSelectedPerson; }
set
{
currentSelectedPerson = value;
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("CurrentSelectedPerson"));
}
}
作为一种替代方案,这也有用,有点简单...
<TextBlock Height="23" Name="textFirstNameBlock" FontSize="12" Margin="97,240,155,144">
<Run Text="Name: " />
<Run Text="{Binding ElementName=ListViewPersonDetails, Path=SelectedItem.FirstName}" FontWeight="Bold" />
</TextBlock>
(对其他文本框重复类似的逻辑)