1

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

当两个数据网格都放在同一页面上时,所选项目有效。但是当我在每一页上分别放置网格时,它就不起作用了。

父页面的 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}"/>

主视图模型

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

2 回答 2

1

编辑:帖子已更改以反映新信息;

我以前从未将 NavigationService 与 WPF 一起使用,所以我不能 100% 确定您可以使用什么,所以如果我错过了什么,请道歉。

但是,如果您将DetailsCollection 移至ChildForm,并使其成为标准属性;

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

作为说明,我不喜欢从代码后面调用导航服务的想法,因为这会使代码混乱且难以测试。

Jesse Liberty 有一篇关于使用 MVVM Light Framework 并允许 ViewModel 直接调用 Navigate Service 的好帖子;

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

于 2013-02-26T14:30:55.287 回答
1

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

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

如果你使用 WPF,你应该看看 Prism。存在许多内置功能。

于 2013-02-26T14:24:57.453 回答