【问题标题】:Get object property stored in listview from another page wpf从另一个页面wpf获取存储在listview中的对象属性
【发布时间】:2015-07-07 22:12:58
【问题描述】:

这是我的课:

class Discussion
{
    public String name {get; set;}
    public String discussionId { get; set; }
    public List<Message> liste {get; set;}

    public Discussion(String name, String discussionId)
    {
        this.name = name;
        this.discussionId = discussionId;
    }

我创建了这个类的一些实例并将它们存储在一个列表视图中。 当我双击 listViewItem(它只显示 name 属性)时,我导航到需要知道讨论 ID 的另一个页面。

我怎样才能得到这个属性? 这就是我导航到新页面的方式:

public partial class DiscussionPage : Page
{
    public DiscussionPage()
    {
        InitializeComponent();

        try
        {
            SqlDataReader read = Broker.sqlcommand("SELECT DISCUSSION.TITRE, USER1.NOM FROM dbo.DISCUSSION, dbo.USER1 WHERE USER1.ID = DISCUSSION.ID_CREER;").ExecuteReader();
            while (read.Read())
            {
                Discussion d = new Discussion(read["TITRE"].ToString(), read["NOM"].ToString());
                listDiscussion.Items.Add(d);
            }
        }
        catch (Exception)
        {

            throw;
        }
    }

    private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        DependencyObject clickedObj = (DependencyObject)e.OriginalSource;

        while (clickedObj != null && clickedObj != listDiscussion)
        {
            if (clickedObj.GetType() == typeof(ListViewItem))
            {
                Discussion selectedDiscussion = (Discussion)listDiscussion.SelectedItem;
                this.NavigationService.Navigate(new MessagePage(selectedDiscussion));
                break;
            }
            clickedObj = VisualTreeHelper.GetParent(clickedObj);
        }
    }

    private void openAddDiscussion(object sender, RoutedEventArgs e)
    {
        addDiscussion add = new addDiscussion();
        add.Show();
    }
}

我需要知道 DiscussionId 才能加载此页面的内容:

public partial class MessagePage : Page
{
    public MessagePage(Discussion SelectedDiscussion)
    {
        InitializeComponent();
        try
        {
            SqlDataReader read = Broker.sqlcommand("SELECT MESSAGE.TEXT FROM dbo.MESSAGE WHERE MESSAGE.ID_POSSEDER = \'" + SelectedDiscussion.discussionId + "\'").ExecuteReader();
            while (read.Read())
            {
                Message m = new Message(read["TEXT"].ToString());
                showMessage.Items.Add(m);
            }
        }
        catch (Exception)
        {
            throw;
        }
    }
}

已添加完整代码,但仍不适用于 SelectedValue:

不连贯的可访问性:参数类型“commApp.Classes.Discussion”比方法“commApp.MessagePage.MessagePage (commApp.Classes.Discussion)”更难访问

【问题讨论】:

  • 您尚未展示如何将项目添加到 ListView,但您应该添加 Discussion 对象,而不是 ListViewItems。执行此操作的常用方法是创建一个视图模型类,该类公开ObservableCollection&lt;Discussion&gt; 类型的属性并将ListView 的ItemsSource 属性绑定到该集合。详细解释见Data Templating Overview

标签: c# wpf parameter-passing listviewitem


【解决方案1】:

没有a good, minimal, complete code example,就不可能确定最好的方法是什么。

但是,如果您正确设置了 ListView 并且 ItemsSourceDiscussion 对象的集合,则默认情况下,SelectedValue 属性将返回与对应的 Discussion 对象实例引用列表中的选定项目。

在这种情况下,您只需将代码更改为如下所示:

private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject clickedObj = (DependencyObject)e.OriginalSource;

    while (clickedObj != null && clickedObj != listDiscussion)
    {
        if (clickedObj.GetType() == typeof(ListViewItem))
        {
            Discussion selectedDiscussion = (Discussion)listDiscussion.SelectedValue;
            this.NavigationService.Navigate(new MessagePage(selectedDiscussion));
            break;
        }
        clickedObj = VisualTreeHelper.GetParent(clickedObj);
    }
}

即只需使用SelectedValue 属性而不是SelectedItem。如果您通过设置SelectedValuePath 属性偏离了默认值,那么您将需要使用ItemContainerGenerator 对象来获取正确的引用:

private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject clickedObj = (DependencyObject)e.OriginalSource;

    while (clickedObj != null && clickedObj != listDiscussion)
    {
        if (clickedObj.GetType() == typeof(ListViewItem))
        {
            Discussion selectedDiscussion =
                (Discussion)listDiscussion.ItemContainerGenerator
                    .ItemFromContainer((ListViewItem)listDiscussion.SelectedItem);

            this.NavigationService.Navigate(new MessagePage(selectedDiscussion));
            break;
        }
        clickedObj = VisualTreeHelper.GetParent(clickedObj);
    }
}

如果这些似乎都不适用于您的情况,请编辑您的问题,使其包含一个好的代码示例,以便提供更好的答案。

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多