我在两个页面上分别有两个数据网格,比如父页面上的父网格和子页面上的子网格。如何访问父页面的选择项到子页面?
当两个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");
}
}
答案 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/