1

マスター詳細レコードを保持するように設定された WPF MVVM アプリケーションに Xceed データグリッドがあります。子行が選択されたときに、ViewModel が選択された子を検出するようにします。できればコードビハインドなしでこれを行いたいと思います。コンテキスト メニューがクリックされたときに、選択した項目に対してアクションを実行するコードを作成しました。これは、親が選択されている場合は正しく機能しますが、子が選択されている場合は常に null を返します。

私が達成しようとしているものの非常に単純化されたバージョンをまとめました:

私のXAMLは次のとおりです。

    <Window x:Class="MasterDetailSelection.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:xcdg="clr-namespace:Xceed.Wpf.DataGrid;assembly=Xceed.Wpf.DataGrid.v4.2"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <xcdg:DataGridCollectionViewSource x:Key="cvs_parents" Source="{Binding Path=Parents}">
                <xcdg:DataGridCollectionViewSource.DetailDescriptions>
                    <xcdg:PropertyDetailDescription RelationName="Children"
                                                    AutoCreateDetailDescriptions="False">
                    </xcdg:PropertyDetailDescription>
                </xcdg:DataGridCollectionViewSource.DetailDescriptions>
            </xcdg:DataGridCollectionViewSource>
        </Grid.Resources>
        <xcdg:DataGridControl x:Name="ParentGrid"
                              NavigationBehavior="RowOnly"
                              ItemsSource="{Binding Source={StaticResource cvs_parents}}"
                              SelectedItem="{Binding SelectedItem}"
           AutoCreateDetailConfigurations="True"
                              ReadOnly="True">
            <xcdg:DataGridControl.ContextMenu>
                <ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">
                    <MenuItem Header="Execute Command" 
                              CommandParameter="{Binding DataContext.SelectedItem}"
                              Command="{Binding DataContext.SampleCommand}" />
                </ContextMenu>
            </xcdg:DataGridControl.ContextMenu>
        </xcdg:DataGridControl>

    </Grid>
</Window>

ビューモデルは次のとおりです。

    namespace MasterDetailSelection
{
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using Microsoft.Practices.Composite.Presentation.Commands;

    public class ViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<Parent> _parents;
        public event PropertyChangedEventHandler PropertyChanged;
        private DelegateCommand<Object> _sampleCommand;
        private object _selectedItem;

        public ObservableCollection<Parent> Parents
        {
            get { return _parents; }

            set
            {
                _parents = value;
                OnPropertyChanged("Parents");
            }
        }

        public DelegateCommand<Object> SampleCommand
        {
            get
            {
                if (_sampleCommand == null)
                {
                    _sampleCommand = new DelegateCommand<object>(ExecuteSampleCommand, CanExecuteSampleCommand);
                    OnPropertyChanged("SampleCommand");
                }
                return _sampleCommand;
            }
        }

        public bool CanExecuteSampleCommand(Object commandParameter)
        {
            return true;
        }

        public void ExecuteSampleCommand(Object commandParameter)
        {
            Console.WriteLine("ExecuteSampleCommand");
        }

        public object SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                if (_selectedItem != value)
                {
                    _selectedItem = value;
                    OnPropertyChanged("SelectedItem");
                }
            }
        }

        public void LoadParents()
        {
            var parents = new ObservableCollection<Parent>()
                {
                    new Parent()
                        {
                            Id=1, 
                            Description = "Parent1",
                            Children  = new List<Child>(){new Child()    {Id = 1, Description = "Child1"}    }
                        }
                };

            Parents = parents;
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

2 つの単純なエンティティがあります。

public class Parent
{
    public int Id { get; set;}
    public string Description { get; set;}
    public IEnumerable<Child> Children { get; set;}
}
public class Child
{
    public int Id { get; set; }
    public string Description { get; set; }
}

App.xaml.cs の OnStartup オーバーライドには、次のものが含まれます。

var viewModel = new ViewModel();
var window = new MainWindow();
window.DataContext = viewModel;
viewModel.LoadParents();
window.Show();

親行を選択するたびに、SelectedItem セッターが読み込まれたオブジェクトで呼び出されます。子行を選択すると、同じセッターが呼び出されますが、値は null です。

コンテキストメニューが子行でクリックされたときに、選択した項目への参照を取得する方法はありますか?コードビハインドなしでこれを行います. そうでない場合、分離コードで可能ですか?

4

1 に答える 1