{A}介绍
更新 - 见下文限制3。
使用标准的DataGrid添加NET 4,我发现我需要执行复制和粘贴。搜寻网际网路来与解决方案要么工作与Silverlight或一些预发布版本的排序,你可以添加到Visual Studio 2008(3)。
我的恐惧,我不得不想办法,并编写一些代码。我很新的WPF,在过去的几个月,从互联网上复制示例代码我使用和修改,但我觉得我终于写的东西,可能是其他人的使用,所以这里是。
归功于以下两页,帮助,并采取一些代码是从第二个(评论计入):{A2的}{A3的}
该解决方案允许你做一些有限的细胞之间的复制和粘贴。在这个例子中,我有一个表领域的第一个名字的人,第二个名字,和腿(数字 - 通常为2)。在我工作的应用程序,它是没有意义的,从一列复制到另一个。因此,在这个例子中,你不能复制的腿列的第一个名字列(例如)。这是故意的限制,可以删去一些检查,很容易被删除。限制/问题解决!它只能处理字符串或整数。它应该是易于扩展,允许更多的代码,但也许可以完全避免了不同的实施类型。剪贴板只从一个特定的格式转换。我需要看到,如果从Excel作品的复制 - 否则,我可能需要把一些代码回DatagridHelper,我删除了!重要的,如果行重新排序,它打破了这个代码!出于这个原因,我建议你不要使用此代码。
雷托Ravisio看到这个{A4}和提供一个更好的解决方案。我已经采取了,稍微改变它,并提供完整的解决方案文件,使用自己的代码:
{A5的}
希望这将有助于像我这样的初学者使用的代码。使用代码
我会去多一些的代码,你必须复制到您的项目,但你必须看到整个解决方案,以获得所需的所有代码。这是一个测试显示您的主要原则,所以你可以决定它是否适合你的。
DataGrid的声明如下:<DataGrid Name="dataGrid1" ItemsSource="{Binding PeopleList}"
SelectionUnit="Cell"
AutoGenerateColumns="True"
KeyDown="dataGrid1_KeyDown"
CopyingRowClipboardContent="dataGrid1_CopyingRowClipboardContent"
ColumnReordered="dataGrid1_ColumnReordered"/>
注意,SelectionUnit设置到手机。这允许单个细胞,而不是整个行选择。该项目是取自一个ObserverableCollection列自动生成。
KeyDown事件设置检测粘贴操作:{C}
正如你可以看到,{A6的}。
视图模型粘贴的函数使用ClipboardHelper的类(在介绍中提到的MSDN博客)转换复制的单元格成一个字符串,它表示每一行的单元格数组列表的字符串版本。然后,它循环通过目标设置的ObservableCollection行。
使用反射来设置集合中的属性,只有一个字符串表示的属性的名称。这样就避免了一个switch语句检查显示指数值和匹配的属性。它会作出的代码非常繁琐的编写和可重复使用的不容易。
的setProperty函数实现该功能:private void SetProperty(Person person, string propertyName, string cellItem)
{
// Use reflection to set the property to the value
Type type = person.GetType();
PropertyInfo prop = type.GetProperty(propertyName);
if (prop == null)
{
Debug.WriteLine("Property not found: " + propertyName);
return;
}
if (prop.PropertyType == typeof(string)) // only caters for string or integer types
prop.SetValue(person, cellItem, null);
else
prop.SetValue(person, int.Parse(cellItem), null);
person.OnPropertyChanged(propertyName);
}
你可以看到在上面的代码上有唯一的字符串或整数的限制来自何处。
的一类人是一个简单的容器类实现INotifyPropertyChanged:{体C3}
代码填充地图的属性名称和显示索引(VM粘贴功能使用)依靠此位的代码,在代码隐藏:{的C4}
我假设,的SortMemberPath将始终是同一类人的财产名称。这是在我的情况。历史2011年9月1日:新的版本,当列重新排序,而不是加载时得到列信息。更新{A7的}基于一个可下载的完整的解决方案。| Peter_Smithson |雷托Ravasio:我想在座的解决方案,您是否是最好的方式做到这一点。
剪贴板数据,你完全为了在屏幕上layed。然后你复制而不列和行订购/能见度到模型中的数据。伊斯利,你可以看到它,当你走动的列。
另一个缺点是,你需要有你在网格的每个数据类型转换器的实现效果。 (见执行::错误**错误**),甚至强硬的绑定引擎已经知道如何从一个字符串转换为所需的类型(至少所有可写列)。
复制数据到网格模型,而不是一个可以防止各种问题。但后来我没有发现任何在互联网上,遵循这条路线,所以它也许只是不可能做到这一点