Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个页面wpf获取存储在listview中的对象属性_C#_Wpf_Parameter Passing_Listviewitem - Fatal编程技术网

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

C# 从另一个页面wpf获取存储在listview中的对象属性,c#,wpf,parameter-passing,listviewitem,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;

这是我的班级:

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;
    }
我需要知道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,并且ItemsSource是讨论对象的集合,则默认情况下,SelectedValue属性将返回与列表中选定项目对应的讨论对象实例引用

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

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

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

您尚未演示如何将项目添加到ListView,但您应该添加讨论对象,而不是ListViewItems。通常的方法是创建一个视图模型类,该类公开ObservableCollection类型的属性,并将ListView的ItemsSource属性绑定到该集合。有关详细说明,请参阅。
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);
    }
}