如何将WPF的ListView中绑定db字段的选中项复制到剪贴板?
谢谢你Cristian
由于你想要的是显示的内容,而不是你的类的属性上的数据,你需要直接从控件中抓取数据。
var sb = new StringBuilder();
foreach(var item in this.listview1.SelectedItems)
{
var lvi = this.listview1.ItemContainerGenerator.ContainerFromItem(item) as ListViewItem;
var cell = this.GetVisualChild<ContentPresenter>(lvi);
var txt = cell.ContentTemplate.FindName("txtCodCli", cell) as TextBlock;
sb.Append(txt.Text);
//TODO: grab the other column's templated controls here & append text
}
System.Windows.Clipboard.SetData(DataFormats.Text, sb.ToString());
这假定在你的XAML中你已经有了
<TextBlock x:Name="txtCodCli" TextAlignment="Left" Text="{Binding Path=VFT_CLI_CODICE}" />
"其中GetVisualChild T是
public T GetVisualChild<T>(Visual parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
我认为你必须监控SelectionChanged事件,然后将项目格式化为特定的文本格式,然后利用Clipboard.SetText方法将项目设置到剪贴板中。
http:/msdn.microsoft.comen-uslibrarysystem.windows.clipboard.aspx。
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var item in e.AddedItems.OfType<ListViewItem>())
{
Clipboard.SetText(item.ToString());
}
}
我是这样解决的。我加入了 Ctrl + C 事件监听器,然后添加逻辑复制到剪贴板。
XAML
<Window
....
Loaded="Window_Loaded"
...>
在编码
private void WindowKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.C && Keyboard.Modifiers == ModifierKeys.Control)
{
var sb = new StringBuilder();
var selectedItems = LVLog.SelectedItems;
foreach(var item in selectedItems)
{
sb.Append($"{item.ToString()}\n");
}
Clipboard.SetDataObject(sb.ToString());
}
}