如何在嵌套的DataGrid中绑定ContextMenu项?

时间:2014-07-10 05:44:32

标签: c# wpf mvvm datagrid

我已经嵌套了DataGrid。嵌套网格显示为所选DataGrid的RowDetails。这是我的类结构,它与DataGrid绑定

public class CustomTable : INotifyPropertyChanged
    {
            public List<DataTable> Main { get; set; }
            private List<string> _menu;
            public List<string> Menu
            {
                 get
                 {   
                     return _menu;
                 }
                 set
                 {
                     _menu = value
                     OnPropertyChanged("Menu");
                 }
            }

            private CustomTable _child;
            public CustomTable Child
            {
                get
                {
                     return _child;
                }
                set
                {
                     _child = value;
                     OnPropertyChanged("Child");
                }
            }
            public DataRowView _selectedItem;
            public DataRowView SelectedItem
            {
                get
                {
                    return _selectedItem;
                }
                set
                {
                    _selectedItem = value;
                    Child = new CustomTable();
                    OnPropertyChanged("SelectedItem");
                }
            }  


        public CustomTable()
        {
            Main = new List<DataTable>();
            Main.Add(someRandomTable());

        }

        private DataTable someRandomTable()
        {
            DataTable table = new DataTable();
            table.Columns.Add("Dosage", typeof(int));
            table.Columns.Add("Drug", typeof(string));
            table.Columns.Add("Patient", typeof(string));
            table.Columns.Add("Date", typeof(DateTime));
            table.Rows.Add(25, "Indocin", "David", DateTime.Now);
            table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
            table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
            table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
            table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
            return table;
        }



        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string caller)
        {

            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(caller));
            }
        }

}

这是我将数据网格绑定到数据表的XAML。我想将菜单列表绑定到DataGrid。感谢

<ScrollViewer>
<ScrollViewer.Resources>
    <DataTemplate DataType="{x:Type l:CustomTable}">
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Path=Main}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <DataGrid Name="dg" SelectedItem="{Binding DataContext.SelectedItem, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor,AncestorType=ItemsControl}}"
                              CanUserAddRows="False"  ItemsSource="{Binding}" AutoGenerateColumns="True" >
                            <DataGrid.RowDetailsTemplate>
                                <DataTemplate>
                                    <ContentControl Margin="10"
                                                    Content="{Binding DataContext.Child, RelativeSource={RelativeSource FindAncestor,AncestorType=ItemsControl,AncestorLevel=2}}"/>
                                </DataTemplate>
                            </DataGrid.RowDetailsTemplate>
                        </DataGrid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </DataTemplate>
</ScrollViewer.Resources>

<ContentControl Content="{Binding TableCollection}"/>

</ScrollViewer>

1 个答案:

答案 0 :(得分:3)

你去吧

截图

screenshot

XAML

<DataGrid Name="dg"
            SelectedItem="{Binding DataContext.SelectedItem, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor,AncestorType=ItemsControl}}"
            CanUserAddRows="False"
            ItemsSource="{Binding}"
            AutoGenerateColumns="True"
            Tag="{Binding DataContext, RelativeSource={RelativeSource FindAncestor,AncestorType=ItemsControl}}">
    <DataGrid.ContextMenu>
        <ContextMenu ItemsSource="{Binding PlacementTarget.Tag.Menu, RelativeSource={RelativeSource Self}}" />
    </DataGrid.ContextMenu>

注意这两件事

    数据网格中的
  • Tag="{Binding DataContext, RelativeSource={RelativeSource FindAncestor,AncestorType=ItemsControl}}"
  • 上下文菜单中的
  • ItemsSource="{Binding PlacementTarget.Tag.Menu, RelativeSource={RelativeSource Self}}"

这是一种解决方法,因为上下文菜单不是数据网格可视化树的一部分,因此无法直接绑定到Menu属性,甚至无法使用FindAncestor

样本菜单生成

public CustomTable()
{
    Main = new List<DataTable>();
    Main.Add(someRandomTable());

    Menu = new List<string>();
    Menu.Add("Menu item 1");
    Menu.Add("Menu item 2");
    Menu.Add("Menu item 3");
    Menu.Add("Menu item 4");

}