如何在其中包含列表框的列表视图中获取 SelectedItem?

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

我无法从作为列表视图子项的列表框中获取所选项目。我尝试过的所有内容 returns 在父列表视图中设置的 GpoObject,但不是从列表框中选择的 OuLink。

这是我的列表框数据模板:

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

这是我的带有列表框的列表视图:

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

绑定对象:

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

SelectedItem="{Binding SelectedOuLink}" 添加到 xaml 中的列表框。

然后在你的 GpoObject class 添加:

public OuLink SelectedOuLink { get; set; }

您现在可以通过 SelectedOuLink 检索选定的 OuLink 对象。

这里有两种方法可以访问 Path 列表框所选项目。我已经命名了列表框以使其在 Xaml 中更容易。为了显示所选信息,我现在在位于列表框上方的文本框中找到它(见图):

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

        }
}

这里是一个选择及其传播到文本框和消息框:


我建议在 OnSelectionChanged 而不是消息框内,您将该选择放入 ViewModel 上的 INotifyPropertyChanged 字符串 属性 中,然后将其传播到程序中的其他项目.