Wpf 如何在单独页面的一页中访问SelectedItem
我在两个页面上分别有两个数据网格,比如父页面上有一个parentgrid,子页面上有一个childgrid。如何将父页面的selecteditem访问到子页面 当两个数据网格放在同一页上时,selecteditem工作。但是当我在每一页上分别放置网格时,它就不起作用了 父页面的XAMLWpf 如何在单独页面的一页中访问SelectedItem,wpf,wpf-controls,wpfdatagrid,Wpf,Wpf Controls,Wpfdatagrid,我在两个页面上分别有两个数据网格,比如父页面上有一个parentgrid,子页面上有一个childgrid。如何将父页面的selecteditem访问到子页面 当两个数据网格放在同一页上时,selecteditem工作。但是当我在每一页上分别放置网格时,它就不起作用了 父页面的XAML <Grid.Datacontext> <local:MainViewModel/> </Grid.Datacontext> <DataGrid AutoGenerat
<Grid.Datacontext>
<local:MainViewModel/>
</Grid.Datacontext>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Persons}" SelectedItem="{Binding SelectedHost, Mode=TwoWay}" SelectionChanged="DataGrid_SelectionChanged"/>
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ChildPage _page = new ChildPage();
this.NavigationService.Navigate(_page);
}
子页面的XAML
<DataGrid x:Name="ChildDatagrid" Margin="12,104,81,266" ItemsSource="{Binding Details}"/>
主视图模型
//Datacontext
public MainViewModel()
{
this.Persons = Person.GetPersons();
}
// for Person Datagrid
private ObservableCollection<Person> personValues;
public ObservableCollection<Person> Persons
{
get { return personValues; }
set { this.SetProperty<ObservableCollection<Person>>(ref this.personValues, value); }
}
//for the PersonDetails datagrid
public ObservableCollection<PersonDetails> Details
{
get
{
if (this.Selectedperson == null)
{
return null;
}
return this.LoadDetails(this.Selectedperson.PersonID);
}
}
// method to load the persondetails data
private ObservableCollection<PersonDetails> LoadDetails(int personID)
{
ObservableCollection<PersonDetails> details = new ObservableCollection<PersonDetails>();
foreach (PersonDetails detail in PersonDetails.GetDetails().Where(item => item.PersonID == personID))
{
details.Add(detail);
}
return details;
}
// SelectedPerson Property
private Person selectedPersonValue;
public Person Selectedperson
{
get { return selectedPersonValue; }
set
{
this.SetProperty<Person>(ref this.selectedPersonValue, value);
this.RaiseNotification("Details");
}
}
//数据上下文
公共主视图模型()
{
this.Persons=Person.GetPersons();
}
//个人数据网格
个人价值观;
公众人士
{
获取{return personValues;}
set{this.SetProperty(ref this.personValues,value);}
}
//对于PersonDetails数据网格
公众可观察的收集详情
{
得到
{
if(this.Selectedperson==null)
{
返回null;
}
返回此.LoadDetails(此.Selectedperson.PersonID);
}
}
//方法来加载persondetails数据
私有ObservableCollection LoadDetails(int personID)
{
ObservableCollection details=新的ObservableCollection();
foreach(PersonDetails.GetDetails()中的PersonDetails细节,其中(item=>item.PersonID==PersonID))
{
详细信息。添加(详细信息);
}
退货详情;
}
//选定人员属性
个人选择的个人价值观;
公众人士
{
获取{返回selectedPersonValue;}
设置
{
this.SetProperty(参考this.selectedPersonValue,value);
本.提高透明度(“细节”);
}
}
您应该创建一个视图模型或对象,将它们传递到两个页面中,并将网格绑定到其中。这样,它们将保持同步
另一种选择是使用和EventAggregator在页面之间发送消息
如果你正在使用WPF,你应该看看Prism。存在许多内置功能。编辑:更改帖子以反映新信息 我以前从未使用过WPF的导航服务,所以我不能100%确定您可以使用什么,所以如果我错过了什么,请道歉 但是,如果您将
详细信息
集合移动到子项
表单,并将其作为标准属性
private ObservableCollection<PersonDetails> _Details;
public ObservableCollection<PersonDetails> Details {
get { return _Details; }
set {
if (value.Equals(_Details) == false)
{
_Details = value;
OnPropertyChanged("Details");
}
}
}
请注意,我不喜欢从代码背后调用Navigiate服务,因为这会使代码变得混乱,难以测试
Jesse Liberty在使用MVVM Light框架以及允许ViewModel直接调用导航服务方面发表了一篇很好的文章
我已经有了一个ViewModel,其中我已经为selecteditem设置了属性。我试图从我的xaml绑定。但它不起作用(它只加载第一个数据网格项,它可以导航,但第二页上的数据网格是空的)prism呢?无论如何,谢谢你的信息。我将仔细寻找答案。我已经在遵循MVVM模式。请参阅标有“答案”的表格。我已经创建了一个VieModel,它设置了所有的绑定。。好啊你能为你的两个数据网格发布XAML吗?请在你的OP中的ViewModel中发布你的属性。请看一下我编辑的问题。我补充说。顺便说一句,我用c#我已经修改了我的原始代码。。。希望这会有所帮助!:-D
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ChildPage _page = new ChildPage();
_page.Details = MainViewModel.LoadDetails(PersonID);
this.NavigationService.Navigate(_page);
}