Wpf 如何在单独页面的一页中访问SelectedItem

Wpf 如何在单独页面的一页中访问SelectedItem,wpf,wpf-controls,wpfdatagrid,Wpf,Wpf Controls,Wpfdatagrid,我在两个页面上分别有两个数据网格,比如父页面上有一个parentgrid,子页面上有一个childgrid。如何将父页面的selecteditem访问到子页面 当两个数据网格放在同一页上时,selecteditem工作。但是当我在每一页上分别放置网格时,它就不起作用了 父页面的XAML <Grid.Datacontext> <local:MainViewModel/> </Grid.Datacontext> <DataGrid AutoGenerat

我在两个页面上分别有两个数据网格,比如父页面上有一个parentgrid,子页面上有一个childgrid。如何将父页面的selecteditem访问到子页面

当两个数据网格放在同一页上时,selecteditem工作。但是当我在每一页上分别放置网格时,它就不起作用了

父页面的XAML

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