【问题标题】:How to Access SelectedItem in one Page on a Separate Page如何在单独页面的一个页面中访问 SelectedItem
【发布时间】:2013-02-26 14:09:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf wpf-controls wpfdatagrid


    【解决方案1】:

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

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

    如果您使用的是 WPF,您应该看看 Prism。存在很多内置功能。

    【讨论】:

    • 我已经有一个 ViewModel,我在其中设置了 selecteditem 的属性。我试图从我的 xaml 中绑定。但它没有工作(它只是加载第一个数据网格项目,它导航但第二页上的数据网格是空的)
    • 棱镜怎么样?无论如何感谢您的信息。我去看看
    【解决方案2】:

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

    我以前从未将 NavigationService 与 WPF 一起使用,所以我不能 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);
    }
    

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

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

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

    【讨论】:

    • 感谢您的回复。我已经在遵循 MVVM 模式。请查看标记为答案“social.msdn.microsoft.com/Forums/en-US/wpf/thread/…”。我创建了一个设置所有绑定的 VieModel。
    • Ahhh.. 好的...您可以发布您的两个 DataGrids 的 XAML,以及您的 OP 中 ViewModel 中的属性吗?
    • 请看我编辑的问题。我已经添加了。顺便说一句,我使用 c#
    • 我已经修改了我的原始代码...希望这会有所帮助! :-D
    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多