使用copy命令使用MVVM灯光复制DataGrid RowDetails中的TextBlock.Text

使用copy命令使用MVVM灯光复制DataGrid RowDetails中的TextBlock.Text,mvvm,datagrid,mvvm-light,Mvvm,Datagrid,Mvvm Light,我是WPF的新手,我正在尝试使用MVVM Light重新编写WPF控件。事实证明,这比我想象的更为努力。以下是一些背景: 这是一个winforms应用程序,其ElementHost包含WPF控件。我最初写的WPF部分完全错了,但它确实有效。WPF控件具有一个WPF Toolkit DataGrid,该DataGrid具有多个数据绑定列以及一个包含数据绑定项的行详细信息区域。所有项目仅显示并绑定到TextBlock对象。在当前迭代中,右键单击记录中的任何TextBlock元素将显示一个上下文菜单,

我是WPF的新手,我正在尝试使用MVVM Light重新编写WPF控件。事实证明,这比我想象的更为努力。以下是一些背景:

这是一个winforms应用程序,其ElementHost包含WPF控件。我最初写的WPF部分完全错了,但它确实有效。WPF控件具有一个WPF Toolkit DataGrid,该DataGrid具有多个数据绑定列以及一个包含数据绑定项的行详细信息区域。所有项目仅显示并绑定到TextBlock对象。在当前迭代中,右键单击记录中的任何TextBlock元素将显示一个上下文菜单,允许将TextBlock的文本复制到剪贴板

这是通过挂起PreviewMouseDown按钮,查看e.OriginalSource,遍历可视化树直到找到TextBlock并缓存它来完成的

请求copy命令时,“can copy”检查是否存在TextBlock“copy object”,并使用Text属性提取值。不优雅,但它确实有效。这一切都是在wpf控件的代码隐藏中完成的

我试图以MVVM方式复制此行为(右键单击并复制TextBlock文本值)。如果它能与ctl-c一起工作,那将是很酷的,但这不是必须的。上下文菜单令人窒息

几天来,我一直在为这个问题绞尽脑汁,所以现在是时候看看是否有人能帮忙了。以下是我到目前为止所做的尝试

  • 尝试使用扩展,但根本不确定如何使其工作。我确实读了很多关于扩展的书,所有的东西似乎都暗示这是一种应该有效的方法。我就是无法控制自己
  • 尝试附加挂接应用程序命令的行为。复制到VM。这是可行的,我在虚拟机中使用了“can copy”和“executed”方法,但我没有足够的信息来查找单击的文本块,因此我无法从中获取文本
  • 通过在鼠标上单击EventToCommand并通过转换器抓取文本,使其可以缓存在VM中,开始沿着相同的路径前进。然后,如果“复制值”存在,则2中的处理程序可以对其进行操作。这似乎可以让我接近,但仍然感觉有点像黑客
  • 在没有任何输入的情况下,我可能会选择选项3,因为它将代码减少到只有两个位置,在转换器中,VM和方法当前都可以工作。似乎应该有一种更简单的方法来做到这一点

    我觉得有必要看看其他人可能会提出什么想法

    提前感谢您的任何意见

    按要求添加屏幕截图和代码:

    本质上,我需要复制显示的文本框中包含的任何文本。请注意,列绑定到成员,但详细信息依赖于.ToString()方法。显示的任何文本都需要能够按照您看到的内容进行复制

    结果发现我太新了,无法发布图片。GUI非常简单,所以我希望代码就足够了

    以下是用于构建该GUI的代码:

    <Window x:Class="DemoCopy.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
    xmlns:local="clr-namespace:DemoCopy"
    DataContext="{Binding Source={StaticResource Locator}, Path=Main}"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <dg:DataGrid Margin="10" ItemsSource="{Binding NamesList}" AutoGenerateColumns="False">
            <dg:DataGrid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Copy" Command="ApplicationCommands.Copy" />
                </ContextMenu>
            </dg:DataGrid.ContextMenu>
            <dg:DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <Border BorderThickness="1" BorderBrush="Black" Margin="1" Background="White" Padding="10">
                        <TextBlock Text="{Binding}" />
                    </Border>
                </DataTemplate>
            </dg:DataGrid.RowDetailsTemplate>
            <dg:DataGrid.Columns>
                <dg:DataGridTemplateColumn ClipboardContentBinding="{Binding First}" Width="*">
                    <dg:DataGridTemplateColumn.Header>First Name</dg:DataGridTemplateColumn.Header>
                    <dg:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding First}" />
                        </DataTemplate>
                    </dg:DataGridTemplateColumn.CellTemplate>
                </dg:DataGridTemplateColumn>
                <dg:DataGridTemplateColumn ClipboardContentBinding="{Binding Middle}" Width="50">
                    <dg:DataGridTemplateColumn.Header>Middle Name</dg:DataGridTemplateColumn.Header>
                    <dg:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Middle}" />
                        </DataTemplate>
                    </dg:DataGridTemplateColumn.CellTemplate>
                </dg:DataGridTemplateColumn>
                <dg:DataGridTemplateColumn ClipboardContentBinding="{Binding Last}" Width="*">
                    <dg:DataGridTemplateColumn.Header>Last Name</dg:DataGridTemplateColumn.Header>
                    <dg:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Last}" />
                        </DataTemplate>
                    </dg:DataGridTemplateColumn.CellTemplate>
                </dg:DataGridTemplateColumn>
            </dg:DataGrid.Columns>
        </dg:DataGrid>
    </Grid>
    
    
    名字
    中名
    姓
    

    public类MainViewModel:ViewModelBase
    {
    私人名单;
    公共IList名称列表
    {
    获取{返回名称列表;}
    设置
    {
    如果(名称列表==值)
    返回;
    名称列表=值;
    RaisePropertyChanged(“名称列表”);
    }
    }
    /// 
    ///初始化MainViewModel类的新实例。
    /// 
    公共主视图模型()
    {
    如果(IsInDesignMode)
    {
    NamesList=新列表();
    NamesList.Add(newmodel.Name()
    {
    First=“John”,
    Middle=“M”,
    Last=“Doe”
    });
    NamesList.Add(newmodel.Name()
    {
    First=“Jane”,
    Middle=“P”,
    Last=“Doe”
    });
    }
    其他的
    {
    NamesList=新列表();
    NamesList.Add(newmodel.Name()
    {
    First=“John”,
    Middle=“M”,
    Last=“Doe”
    });
    NamesList.Add(newmodel.Name()
    {
    First=“Jane”,
    Middle=“P”,
    Last=“Doe”
    }); 
    }
    }
    }
    公共类名
    {
    第一个公共字符串{get;set;}
    公共字符串中间{get;set;}
    公共字符串Last{get;set;}
    公共重写字符串ToString()
    {
    返回string.Format(“{0}{1}{2}”,第一、中间、最后);
    }
    }
    

    scot.

    请附上屏幕截图并添加源代码,以便更好地了解问题,好吗?
        public class MainViewModel : ViewModelBase
    {
        private IList<Model.Name> namesList;
        public IList<Model.Name> NamesList
        {
            get { return namesList; }
            set
            {
                if (namesList == value)
                    return;
                namesList = value;
                RaisePropertyChanged("NamesList");
            }
        }
    
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            if (IsInDesignMode)
            {
                NamesList = new List<Model.Name>();
                NamesList.Add(new Model.Name()
                {
                    First = "John",
                    Middle = "M",
                    Last = "Doe"
                });
                NamesList.Add(new Model.Name()
                {
                    First = "Jane",
                    Middle = "P",
                    Last = "Doe"
                });
            }
            else
            {
                NamesList = new List<Model.Name>();
                NamesList.Add(new Model.Name()
                {
                    First = "John",
                    Middle = "M",
                    Last = "Doe"
                });
                NamesList.Add(new Model.Name()
                {
                    First = "Jane",
                    Middle = "P",
                    Last = "Doe"
                }); 
            }
        }
    }
    
    public class Name
    {
        public string First { get; set; }
        public string Middle { get; set; }
        public string Last { get; set; }
    
        public override string ToString()
        {
            return string.Format("{0} {1} {2}", First, Middle, Last);
        }
    }