Pregunta

Tengo una cuadrícula de datos que tiene una columna de hipervínculo con el siguiente código:

<dg:DataGrid Style="{StaticResource DataGridStyle}" x:Name="movieGrid"
         ItemsSource="{Binding ElementName=This, Path=movieData}">
        <dg:DataGrid.ContextMenu>
            <ContextMenu Name="cm">
                <MenuItem Header="Copy" Click="CopyCell_Click"/>
            </ContextMenu>
        </dg:DataGrid.ContextMenu>
        <dg:DataGrid.Columns>
            <dg:DataGridTemplateColumn x:Name="editColumn" Width="40" Header="Edit" CanUserResize="False">
                <dg:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Edit" Height="20" Tag="{Binding Path}" Click="Edit_Click"/>
                    </DataTemplate>
                </dg:DataGridTemplateColumn.CellTemplate>
            </dg:DataGridTemplateColumn>
            <dg:DataGridTextColumn x:Name="titleColumn" IsReadOnly="True" Binding="{Binding Title}" Header="Title" SortDirection="ascending" />
            <dg:DataGridTextColumn Visibility="Collapsed" x:Name="titleDiffColumn" IsReadOnly="True" Binding="{Binding IMDBTitle}" Header="IMDBTitle" />
            <dg:DataGridTextColumn x:Name="scoreColumn" IsReadOnly="True" Width="60"  Binding="{Binding Score}" Header="Score" />
            <dg:DataGridTextColumn x:Name="yearColumn" IsReadOnly="True" Width="60" Binding="{Binding Year}" Header="Year" />
            <dg:DataGridTextColumn x:Name="genreColumn" IsReadOnly="True" Binding="{Binding Genre}" Header="Genre" />
            <dg:DataGridTemplateColumn x:Name="linkColumn" Width="195" Header="Link">
                <dg:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Margin="3,0,0,0"><Hyperlink Tag="{Binding Link}" Click="Link_Click"><TextBlock Text="{Binding Link}"/></Hyperlink></TextBlock>
                    </DataTemplate>
                </dg:DataGridTemplateColumn.CellTemplate>
            </dg:DataGridTemplateColumn>
            <dg:DataGridCheckBoxColumn x:Name="seenColumn" Width="60" Binding="{Binding Seen}" Header="Seen"/>
        </dg:DataGrid.Columns>
    </dg:DataGrid>

Como se puede ver u Puedo usar un menú contextual en las células para obtener su valor, usando el siguiente código:

//copy datagrid item
    private void CopyCell_Click(object sender, RoutedEventArgs e)
    {
        DataRowView itemsSource = movieGrid.CurrentItem as DataRowView;
        int index = movieGrid.CurrentColumn.DisplayIndex;
        string cellValue = itemsSource.Row.ItemArray[index - 1].ToString();
        Clipboard.SetData(DataFormats.Text, cellValue);
    }

Esto, obviamente, no funciona en la columna de hipervínculo ya que es un TemplateColumn.

¿Hay una obra arround todavía el enlace copiado?

He intentado con un menú contextual en el mismo hiperenlace, pero no funcionó, las referencias a objetos estaban equivocados.

Gracias un montón,

cordiales,

-WtFudgE -

¿Fue útil?

Solución

Su código funciona para mí, siempre y cuando el usuario selecciona la celda que debe quedar copiado antes de abrir el menú contextual. He utilizado el siguiente código detrás de probarlo. Qué problema que se está viendo?

using System.Data;
using System.Windows;

namespace GridLinkTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            DataContext = this;

            DataTable dataTable = new DataTable("MovieData");
            dataTable.Columns.Add(new DataColumn("Title"));
            dataTable.Columns.Add(new DataColumn("IMDBTitle"));
            dataTable.Columns.Add(new DataColumn("Score"));
            dataTable.Columns.Add(new DataColumn("Year"));
            dataTable.Columns.Add(new DataColumn("Genre"));
            dataTable.Columns.Add(new DataColumn("Link"));
            dataTable.Columns.Add(new DataColumn("Seen"));

            DataRow row = dataTable.NewRow();
            row["Title"] = "Watchmen";
            row["IMDBTitle"] = "Watchmen";
            row["Score"] = 7.8;
            row["Year"] = 2009;
            row["Genre"] = "Action";
            row["Seen"] = true;
            row["Link"] = "www.imdb.com/title/tt0409459";
            dataTable.Rows.Add(row);

            movieData = new DataView(dataTable);
        }

        public DataView movieData { get; set;}

        private void CopyCell_Click(object sender, RoutedEventArgs e)
        {
            DataRowView itemsSource = movieGrid.CurrentItem as DataRowView;
            int index = movieGrid.CurrentColumn.DisplayIndex;
            string cellValue = itemsSource.Row.ItemArray[index - 1].ToString();
            Clipboard.SetData(DataFormats.Text, cellValue);
        }

        private void Edit_Click(object sender, RoutedEventArgs e) {}

        private void Link_Click(object sender, RoutedEventArgs e) {}
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top