我有一个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;
}
答案 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}>