WPF Datagrid Гиперссылка правой кнопкой мыши - PullRequest
0 голосов
/ 02 декабря 2009

У меня есть таблица данных, в которой есть один столбец гиперссылки со следующим кодом:

<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>

Как вы можете видеть, я использую контекстное меню для ячеек, чтобы получить их значение, используя следующий код:

//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);
    }

Это явно не работает для столбца гиперссылки, так как это столбец шаблона.

Есть ли работа, чтобы все еще копировать ссылку?

Я попытался с контекстным меню на самой гиперссылке, но это не сработало, ссылки на объекты были неправильными.

Спасибо большое,

С уважением,

-WtFudgE-

1 Ответ

1 голос
/ 02 декабря 2009

Ваш код работает для меня, пока пользователь выбирает ячейку, которая должна быть скопирована перед открытием контекстного меню. Я использовал приведенный ниже код для его проверки. Какую проблему вы видите?

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) {}
    }
}
...