如何在单独页面上的一个页面中访问所选项目

时间:2013-02-26 14:09:49

标签: wpf wpf-controls wpfdatagrid

我在两个页面上分别有两个数据网格,比如父页面上的父网格和子页面上的子网格。如何访问父页面的选择项到子页面?

当两个datagrid放在同一页面上时,selecteditem可以正常工作。但是当我将网格分别放在每个页面上时,它不起作用。

ParentPage的XAML

<Grid.Datacontext>
 <local:MainViewModel/>
</Grid.Datacontext>
 <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Persons}" SelectedItem="{Binding SelectedHost, Mode=TwoWay}" SelectionChanged="DataGrid_SelectionChanged"/>

ParentPage的代码隐藏

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}"/>

MainViewModel

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

2 个答案:

答案 0 :(得分:1)

您应该创建一个ViewModel或Object,将它们传递到两个页面并将网格绑定到它。这样他们就会保持同步。

备用选项是使用和EventAggregator在您的页面之间发送消息。

如果你正在使用WPF,你应该看一下Prism。存在许多内置功能。<​​/ p>

答案 1 :(得分:1)

编辑:发布更改以反映新信息;

我之前从未使用过带有WPF的NavigationService,所以我不能100%确定你可以使用什么,所以如果我错过了什么就道歉。

但是,如果您将Details收藏集移至Child表单,并将其设为标准媒体资源;

private ObservableCollection<PersonDetails> _Details;
public ObservableCollection<PersonDetails> Details {
    get { return _Details; }
    set {
            if (value.Equals(_Details) == false)
            {
                _Details = value;
                OnPropertyChanged("Details");
            }
    }
}

假设您引用了MainViewModel,则可以使用以下方式导航到您的页面;

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ChildPage _page = new ChildPage();
    _page.Details = MainViewModel.LoadDetails(PersonID);
    this.NavigationService.Navigate(_page);
}

作为一个注释,我不喜欢从代码中调用Navigiate Service的想法,因为这会使代码变得混乱且难以测试。

Jesse Liberty在使用MVVM Light Framework方面发表了很好的帖子,并允许ViewModel直接调用Navigate Service;

http://jesseliberty.com/2012/01/17/calling-navigate-from-the-view-model/