ListView:从ListViewItem获取实际的项目对象

时间:2014-02-23 10:50:31

标签: c# wpf listview

我正在将我自己的类的项添加到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:所有列都是空的,它没有被正确填充。

3 个答案:

答案 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

http://msdn.microsoft.com/de-De/library/system.windows.controls.itemcontainergenerator.itemfromcontainer.aspx


  

我尝试从ListViewItem继承ProblemsListItem。当然,我可以在处理程序中将项目转换为ProblemsListItem类型,但是   这完全打破了ListView:所有列都是空的,它不存在   填写正确。

然后,您还应该覆盖ListView并使其使用自定义容器来显示项目。

public class MyListView : ListView
{
        protected override DependencyObject GetContainerForItemOverride()
        {
            return new ProblemsListItem();
        }
}