我正在将我自己的类的项添加到ListView
(listview已正确设置绑定):
_listView.Items.Add(new ProblemsListItem());
我有一个MouseDoubleClick
处理程序,它获取了一个被点击的ListViewItem
:
void onProblemDoubleClick(object sender, MouseButtonEventArgs e)
{
ListViewItem item = FindVisualParent<ListViewItem, ListView>(e.OriginalSource as DependencyObject);
}
public static TParent FindVisualParent<TParent, TLimit>(DependencyObject obj) where TParent : DependencyObject
{
while (obj != null && !(obj is TParent))
{
if (obj is TLimit)
return null;
obj = VisualTreeHelper.GetParent(obj);
}
return obj as TParent;
}
我的问题是:如何将此ListViewItem
转换为ProblemsListItem
个对象,或从该项中获取此对象?
我尝试从ProblemsListItem
继承ListViewItem
。然后我可以在处理程序中将item
转换为ProblemsListItem
类型,但这完全打破了ListView:所有列都是空的,它没有被正确填充。
答案 0 :(得分:4)
您可以使用ItemContainerGenerator
获取数据项:
var dataItem = yourListView.ItemContainerGenerator.ItemFromContainer(yourListViewItem);
但这段代码闻起来。我看不出任何不使用数据绑定的理由,并且在执行ICommand
实现时处理双击。
答案 1 :(得分:2)
如果有人需要轻松解决此问题,以下是从ListViewItem获取实际项目的方法。
void onProblemDoubleClick(object sender, MouseButtonEventArgs e)
{
var item = sender as ListViewItem;
if (item != null && item.IsSelected)
{
//here is your ProblemsListItem item
var actualItem = (ProblemsListItem)item.Content;
}
}
答案 2 :(得分:1)
你的例子中有一些问题你应该考虑纠正,以使wpf能够很好地适应你的自定义逻辑。
我有一个MouseDoubleClick处理程序,它获取一个ListViewItem 点击了:
如果你有一个继承自ListViewItem的自定义容器,你应该考虑订阅类中的鼠标事件,这样你就不会找到容器的实例了。无论如何,您将位于当前单击的容器的实例中。
如何将此ListViewItem转换为我的ProblemsListItem对象,或者 从项目中获取此对象?
为了在wpf中获取容器后面的项目,您可以使用方法ItemContainerGenerator.ItemFromContainer
我尝试从ListViewItem继承ProblemsListItem。当然,我可以在处理程序中将项目转换为ProblemsListItem类型,但是 这完全打破了ListView:所有列都是空的,它不存在 填写正确。
然后,您还应该覆盖ListView并使其使用自定义容器来显示项目。
public class MyListView : ListView
{
protected override DependencyObject GetContainerForItemOverride()
{
return new ProblemsListItem();
}
}