如何绑定文本菜单项目中嵌套的DataGrid?(How to bind ContextMenu it

2019-10-20 10:40发布

我有嵌套数据网格。 嵌套网格被显示为选定的数据网格的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));
            }
        }

}

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

<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>

Answer 1:

干得好

截图

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}}"在上下文菜单

这是一种解决方法作为上下文菜单没有数据网格的可视树的一部分,从而不能使用直接或甚至结合于菜单属性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");

}


文章来源: How to bind ContextMenu items in a nested DataGrid?