【问题标题】:ListView: getting an actual item object from ListViewItemListView:从 ListViewItem 获取实际的项目对象
【发布时间】:2017-07-25 18:50:16
【问题描述】:

我正在将我自己班级的项目添加到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 对象,或从项目中获取此对象?

我尝试从ListViewItem 继承ProblemsListItem。然后我当然可以在处理程序中将item 转换为ProblemsListItem 类型,但这完全破坏了ListView:所有列都是空的,它没有被正确填充。

【问题讨论】:

  • 从 SelectedItem 到 ProblemsListItem 的简单转换将起作用。
  • @VasileMarianFălămaş:SelectedItem 是什么?我这里只有ListViewItem,不能转换成ProblemsListItem
  • ListViewItem.DataContext 不是包含ProblemsListItem吗?

标签: c# wpf listview


【解决方案1】:

您可以使用ItemContainerGenerator获取数据项:

var dataItem = yourListView.ItemContainerGenerator.ItemFromContainer(yourListViewItem);

但是这段代码有异味。我看不出有任何理由不使用数据绑定,并将双击处理为执行ICommand 实现。

【讨论】:

  • 我什至不明白你在那里说什么,只用了几天的WPF。这是实用程序代码,我的目标是用最少的努力和最少的行数来编写它。此外,以最清晰易读的方式,以便其他不了解 WPF 的人能够理解它。到目前为止,它看起来对我来说是可读的。
【解决方案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;               
            }
}

【讨论】:

    【解决方案3】:

    在您的示例中,您应该考虑纠正一些错误,以使 wpf 与您的自定义逻辑配合得很好。

    我有一个 MouseDoubleClick 处理程序,它获取一个 ListViewItem 被点击:

    如果你有一个继承自 ListViewItem 的自定义容器,你应该考虑在类中订阅鼠标事件,这样你就可以避免找到容器的实例。无论如何,您将在当前单击的容器的实例中。


    如何将此 ListViewItem 转换为我的 ProblemsListItem 对象,或者 从项目中获取此对象?

    为了在 wpf 中获取容器后面的项目,您可以使用 ItemContainerGenerator.ItemFromContainer 方法

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


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

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

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

    【讨论】:

    • 啊,这就解释了。 WPF 对新手来说似乎(过度)复杂,文档要么缺乏要么很难找到。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2012-10-20
    • 2017-04-20
    相关资源
    最近更新 更多