WPF ListView SelectedItem 为空
Posted
技术标签:
【中文标题】WPF ListView SelectedItem 为空【英文标题】:WPF ListView SelectedItem is null 【发布时间】:2011-02-06 04:22:42 【问题描述】:我有一个列表视图,其中有一个复选框作为列之一。如果我单击实际复选框之外的任何位置,则 ListView 的 SelectedItem 会按预期设置为当前选定的行。另一方面,如果我单击复选框(没有先单击行),则 SelectedItem 为空或先前单击的行。
谁能帮帮我....
干杯
<ListView Width="auto" SelectionMode="Single" x:Name="listBox" ItemsSource="Binding MyData" SelectedItem="Binding Path=SelectedMyData">
<ListView.View>
<GridView>
<GridViewColumn Header="Date" Width="120">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Style="StaticResource DateTimeContent" Content="Binding MyDate"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Is Correct" Width="100">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsThreeState="False"
Checked="OnChkChecked"
Unchecked="OnChkChecked"
IsChecked="Binding IsCorrect"></CheckBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsThreeState="False"
Checked="OnChkChecked"
Unchecked="OnChkChecked"
IsChecked="Binding IsCorrect"></CheckBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
【问题讨论】:
【参考方案1】:您必须解析您的可视化树以获取选中复选框的索引,并在选中某个复选框时选择代码中的特定列表框项
你可能也有兴趣
How to get checked items in a WPF ListBox?
和
http://goalbook.wordpress.com/2009/09/05/wpf-checkedlist-control/
【讨论】:
+1 .... 抱歉回复晚了。是的,必须解析可视化树,但不是按照您的链接建议的那样。尽管如此,感谢您的回复。看我的回答。【参考方案2】:这很简单,只需处理复选框上的 Click 事件:
private void CheckBox_Click(object sender, RoutedEventArgs e)
var cb = sender as CheckBox;
var item = cb.DataContext;
myListView.SelectedItem = item;
【讨论】:
+1 确实非常简单。我应该戴一副眼镜。我读了你的回答,我以为你误解了这个问题。是我误解了你的答案。很简单....谢谢:-) 我一直在寻找几个小时,这正是我想找的东西!它完美地工作。太感谢了!确实如此简单。【参考方案3】:Veer 建议解析可视化树以获取复选框。事情是我已经有了复选框。我需要的是包含复选框的 listviewitem。经过进一步研究,blog post 为我指明了正确的方向。这是获取单击复选框的行的列表视图项的代码:
private void chkbox_Checked(object sender, RoutedEventArgs e)
DependencyObject dep = e.OriginalSource as DependencyObject;
while ((dep != null) && !(dep is ListViewItem))
dep = VisualTreeHelper.GetParent(dep);
if (dep != null)
IMyViewModel vm = DataContext as IMyViewModel;
vm.SelectedThing = (MyListItemViewModel)lst.ItemContainerGenerator.ItemFromContainer(dep);
vm.DoSomethingCommand.Execute(e.RoutedEvent.Name.ToLower());
【讨论】:
您尝试 @majocha 的回答了吗?以上是关于WPF ListView SelectedItem 为空的主要内容,如果未能解决你的问题,请参考以下文章
UI响应性并使用WPF中的“SelectedItem”ListView / ListBox
如何将listView的selectedItem值传递到wpf MVVM中的另一页
如何使用 TwoWay 模式将 Listview SelectedItem 绑定到文本框?