如何在Listview中使用Listbox获取SelectedItem?

时间:2015-02-23 21:35:05

标签: c# wpf data-binding

我无法从列表框中获取选定项目,列表框是列表视图的子项。我尝试过的所有内容都会返回在父列表视图中设置的GpoObject,但不会返回列表框中选定的OuLink。

这是ListBox的DataTemplate:

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

这是我的Listview,里面有ListBox:

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

2 个答案:

答案 0 :(得分:1)

以下两种方法可以访问ListBox所选项目的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>

然后在选择更改时,我向用户显示所选路径的消息框:

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

        }
}

以下是选择及其在文本框和消息框中的传播: enter image description here


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

答案 1 :(得分:0)

SelectedItem="{Binding SelectedOuLink}"添加到xaml中的ListBox。

然后在你的GpoObject课程中添加:

public OuLink SelectedOuLink { get; set; }

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