使用copy命令使用MVVM灯光复制DataGrid RowDetails中的TextBlock.Text
我是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一起工作,那将是很酷的,但这不是必须的。上下文菜单令人窒息 几天来,我一直在为这个问题绞尽脑汁,所以现在是时候看看是否有人能帮忙了。以下是我到目前为止所做的尝试使用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元素将显示一个上下文菜单,
<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);
}
}