WPF中的自定义列表框选择

时间:2015-04-07 15:37:00

标签: wpf listboxitem

我有一个Custom ListBox,每个Item有多个列

<ListBox Name="UserListBox" Loaded="GetUsers_OnLoad" SelectionChanged="UserSelected">
<ListBox.ItemTemplate>
    <DataTemplate>
        <DockPanel Name="UserDockPanel" Margin="4">
            <TextBlock Name="UsernameTextBlock" Text="{Binding Path=Username}"/>
            <CheckBox Name="OneCheckBox" IsHitTestVisible="False" IsChecked="{Binding One}" />
            <CheckBox Name="TwoCheckBox" IsHitTestVisible="False" IsChecked="{Binding Two}" />
            <CheckBox Name="ThreeCheckBox" IsHitTestVisible="False" IsChecked="{Binding Three}" />
        </DockPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

我想要做的是当用户选择一个我可以解析该项目的各个值的项目时(UsernameTextBlock,OneCheckbox,TwoCheckBox,ThreeCheckBox)。

我已经尝试选择哪个引发错误并且选择更改似乎有效,但我不知道如何检索所选项目的各个值。

任何见解都将受到赞赏。

更新

以下是

背后的代码
private void UserSelected(object sender, RoutedEventArgs e)
{
    var userListBox = FindName("UserListBox") as ListBox;

    var selectedItem = userListBox.SelectedItem as ListBoxItem;

    MessageBox.Show(selectedItem.Username);
}

我目前只是显示一条消息弹出窗口,以显示我正在访问的内容

更新2:

private void GetUsers_OnLoad(object sender, RoutedEventArgs e)
{
    _outreachAuths = _outreachTableAdapter.GetOutreachAuths();

    var users = new List<UserItem>();

    foreach (DataRow row in _outreachAuths.Rows)
    {
        users.Add(new UserItem() { Username = row.ItemArray[0].ToString(), One = false, Two = true, Three = ((row.ItemArray[2].ToString() == "1"))});
    }

    var userList = sender as ListBox;
    if (userList != null) userList.ItemsSource = users;
}

2 个答案:

答案 0 :(得分:1)

在UserSelected处理程序中,您将所选项目强制转换为ListBoxItem:

var selectedItem = userListBox.SelectedItem as ListBoxItem;

为了访问您正在寻找的属性,您需要将其转换为原始类型,我相信UserItem

var selectedItem = userListBox.SelectedItem as UserItem;

答案 1 :(得分:0)

将列表框的SelectedItem属性绑定到视图模型中的属性。然后,当VM中的值发生变化时,您将可以访问该项目。

<ListBox Name="UserListBox" Loaded="GetUsers_OnLoad" SelectionChanged="UserSelected" SelectedItem={Binding Path=PropertyOnViewModel}>