从另一个页面wpf获取存储在listview中的对象属性

时间:2015-04-28 21:07:26

标签: c# wpf parameter-passing listviewitem

这是我的班级:

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;
    }

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

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

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:

  

不连贯的可访问性:参数类型&#39; commApp.Classes.Discussion&#39;比方法&commief.MessagePage.MessagePage(commApp.Classes.Discussion)&#39;

更难访问

1 个答案:

答案 0 :(得分:0)

如果没有a good, minimal, complete code example,就无法确定最佳方法是什么。

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

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

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

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