Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf Micro:如何将函数绑定到DataGrid的RowDetailsTemplate中的上下文菜单项?_Wpf_Data Binding_Datagrid_Contextmenu_Caliburn.micro - Fatal编程技术网

Wpf Micro:如何将函数绑定到DataGrid的RowDetailsTemplate中的上下文菜单项?

Wpf Micro:如何将函数绑定到DataGrid的RowDetailsTemplate中的上下文菜单项?,wpf,data-binding,datagrid,contextmenu,caliburn.micro,Wpf,Data Binding,Datagrid,Contextmenu,Caliburn.micro,我有一个项目的datagrid,其中包括行详细信息的子项目的datagrid。主“Items”数据网格有一个上下文菜单,其中包含添加或删除项的函数,这很好。还有一个用于row details数据网格“SubItems”的上下文菜单,它具有类似的功能,我无法正确绑定这些功能。如果执行,我会得到以下异常“System.exception:'找不到方法AddSubItem的目标”。” 我拼命地尝试了许多其他帖子上建议的解决方案,但到目前为止都没有效果。我很欣赏你的见解。下面是我的测试代码 ShellV

我有一个项目的datagrid,其中包括行详细信息的子项目的datagrid。主“Items”数据网格有一个上下文菜单,其中包含添加或删除项的函数,这很好。还有一个用于row details数据网格“SubItems”的上下文菜单,它具有类似的功能,我无法正确绑定这些功能。如果执行,我会得到以下异常“System.exception:'找不到方法AddSubItem的目标”。”

我拼命地尝试了许多其他帖子上建议的解决方案,但到目前为止都没有效果。我很欣赏你的见解。下面是我的测试代码

ShellViewModel:

using System;
using Caliburn.Micro;
using ContextMenuTest.Models;

namespace ContextMenuTest.ViewModels
{
    public class ShellViewModel : Screen
    {
        public static Random rnd = new Random();
        private BindableCollection<ItemModel> items = new BindableCollection<ItemModel>();
        public BindableCollection<ItemModel> Items
        {
            get { return items; }
            set
            {
                items = value;
                NotifyOfPropertyChange(() => Items);
            }
        }

        private ItemModel selectedItem = new ItemModel(rnd);
        public ItemModel SelectedItem
        {
            get { return selectedItem; }
            set
            {
                selectedItem = value;
                NotifyOfPropertyChange(() => SelectedItem);
            }
        }

        private SubItemModel selectedSubItem = new SubItemModel(rnd);
        public SubItemModel SelectedSubItem
        {
            get { return selectedSubItem; }
            set
            {
                selectedSubItem = value;
                NotifyOfPropertyChange(() => SelectedSubItem);
            }
        }

        public ShellViewModel()
        {
            for(int i = 0; i < 10; i++)
            {
                Items.Add(new ItemModel(rnd));
            }
        }

        public void AddItem()
        {
            Items.Add(new ItemModel(rnd));
        }

        public void RemoveItem()
        {
            Items.Remove(SelectedItem);
        }

        public void AddSubItem(object e)
        {
            var _item = e as ItemModel;
            _item.SubItems.Add(new SubItemModel(rnd));
        }

        public void RemoveSubItem(object e)
        {
            var _item = e as ItemModel;
            _item.SubItems.Remove(SelectedSubItem);
        }
    }
}

尝试使用TagHelper。它符合您的要求。示例代码如下

<Grid Background="White" HorizontalAlignment="Stretch" Height="200" Name="GridLayout">
    <ListBox x:Name="ListBoxItems">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Tag="{Binding DataContext, ElementName=GridLayout}">
                    <Grid.ContextMenu>
                        <ContextMenu Name="cm" cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Open"
                                      cal:Message.Attach="Open($dataContext)">
                            </MenuItem>
                        </ContextMenu>
                    </Grid.ContextMenu>

                    <TextBlock VerticalAlignment="Center">
                        .. text..
                    </TextBlock>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

.. 文本
using Caliburn.Micro;
using System;

namespace ContextMenuTest.Models
{
    public class ItemModel
    {
        public Guid ID { get; set; }
        public string Name { get; set; }
        public BindableCollection<SubItemModel> SubItems { get; set; } = new BindableCollection<SubItemModel>();

        public ItemModel(Random rnd)
        {
            ID = Guid.NewGuid();
            Name = "Item " + ID.ToString().Substring(3, 5);

            for (int i = 0; i < 5; i++)
            {
                SubItems.Add(new SubItemModel(rnd));
            }
        }
    }
}
using System;

namespace ContextMenuTest.Models
{
    public class SubItemModel
    {
        public Guid ID { get; set; }
        public string Name { get; set; }
        public int Value { get; set; }

        public SubItemModel(Random rnd)
        {
            ID = Guid.NewGuid();
            Name = "SubItem " + ID.ToString().Substring(3,5);
            Value = rnd.Next();
        }
    }
}
<Grid Background="White" HorizontalAlignment="Stretch" Height="200" Name="GridLayout">
    <ListBox x:Name="ListBoxItems">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Tag="{Binding DataContext, ElementName=GridLayout}">
                    <Grid.ContextMenu>
                        <ContextMenu Name="cm" cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Open"
                                      cal:Message.Attach="Open($dataContext)">
                            </MenuItem>
                        </ContextMenu>
                    </Grid.ContextMenu>

                    <TextBlock VerticalAlignment="Center">
                        .. text..
                    </TextBlock>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>