1

親ページに親グリッド、子ページに子グリッドなど、2 つのページに別々に 2 つのデータグリッドがあります。親ページの選択したアイテムを子ページにアクセスする方法は?

両方のデータグリッドが同じページに配置されると、選択されたアイテムが機能します。しかし、グリッドを各ページに個別に配置すると、機能しません。

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

2 に答える 2

1

ViewModel または Object を作成し、それらを両方のページに渡し、グリッドをバインドする必要があります。このようにして、それらは同期を保ちます。

代替オプションは、EventAggregator を使用してページ間でメッセージを送信することです。

WPF を使用している場合は、Prism を調べてください。多くの組み込み機能が存在します。

于 2013-02-26T14:24:57.453 に答える
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/

于 2013-02-26T14:30:55.287 に答える