简体   繁体   中英

SelectedItem in ListView binding

I'm new to WPF. In my sample application I'm using a ListView to display contents of property. I don't know how to bind SelectedItem in ListView to property and then bind to 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;
        }

    }

Thanks for any help.

private void Window_Loaded(object sender, RoutedEventArgs e){
    ListViewPersonDetails.ItemsSource= manager.GetPersons();
}

This is probably your problem, you shouldn't have to set the itemssource like this. Just replace with this line...

this.DataContext = this;

This is what will bind your properties to the UI, so that all those binding statements have any meaning.

Also you need to update the binding on your textblocks to actually match the names of the properties in the Person class.

<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>

EDIT:

Tested in VS, you need 1 more small thing, to implement INotifyPropertyChanged on the CurrentSelectedPerson property...

private Person currentSelectedPerson;
public Person CurrentSelectedPerson 
{
    get { return currentSelectedPerson; }
    set 
    {
        currentSelectedPerson = value;
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("CurrentSelectedPerson"));
    }
}

As an alternative this works too, a little simpler...

<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>

(repeat similar logic for other text boxes)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM