简体   繁体   中英

How do I get the SelectedItem in a Listview with Listbox in it?

I am having trouble getting the selecteditem from a listbox which is a child of a listview. Everything that I've tried returns the GpoObject which is set at the parent listview, but not the selected OuLink from the Listbox.

This is my DataTemplate for the ListBox:

        <DataTemplate x:Key="OuTemplate">
            <Label Content="{Binding Path=Path}"/>
        </DataTemplate>

This is my Listview with the ListBox in it:

    <ListView x:Name="OutListView" 
              BorderBrush="#FFA0A0A0" 
              BorderThickness="1">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Group Policy Objects" 
                                Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Grid.Column="0" 
                                       Text="{Binding Path=Name}" 
                                       Width="Auto"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Organizational Units">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ListBox Grid.Column="1" 
                                     ItemsSource="{Binding Path=OUs}" 
                                     ItemTemplate="{DynamicResource OuTemplate}"  
                                     Width="Auto" Height="Auto" 
                                     BorderThickness="0"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

Object for binding:

public class GpoObject 
{
    public string Name {get; set;}
    public string Id { get; set; }
    public List<OuLink> OUs { get; set; }


}

public class OuLink 
{
    public string Path { get; set; }
}

Here are two ways to access the Path off of the ListBox selected item. I have named the listbox to make it easier in Xaml. To show the selected info I pathed to it in a textbox now which resides above the Listbox (see image):

<GridViewColumn.CellTemplate>
    <DataTemplate>
        <StackPanel>
            <TextBlock x:Name="tbSelected"
                        Text="{Binding ElementName=PathBox, Path=SelectedItem.Path}" />
            <ListBox x:Name="PathBox"
                        SelectionChanged="PathBox_OnSelectionChanged"
                        ItemsSource="{Binding Path=OUs}"
                        ItemTemplate="{DynamicResource OuTemplate}"/>
        </StackPanel>
    </DataTemplate>
</GridViewColumn.CellTemplate>

Then on when the selection changes I present the user with a message box of the selected path:

private void PathBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var lbi = sender as ListBox;
    if (lbi != null)
        if (lbi.SelectedItem != null)
        {
            var link = lbi.SelectedItem as OuLink;

            if (link != null)
                MessageBox.Show(link.Path);

        }
}

Here is a selection and its propagation to the textbox and the message box: 在此处输入图片说明


I suggest that within the OnSelectionChanged instead of a messagebox you place that selection into a INotifyPropertyChanged string property on your ViewModel and propagate it that way to other items within the program.

Add SelectedItem="{Binding SelectedOuLink}" to your ListBox in your xaml.

Then in your GpoObject class add:

public OuLink SelectedOuLink { get; set; }

You can now retrieve the selected OuLink object via SelectedOuLink .

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