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