Silverlight 3 Сетка данных:Получить строку / элемент при наведении курсора мыши

StackOverflow https://stackoverflow.com/questions/1866189

Вопрос

У меня есть связанная сетка данных и различные другие элементы управления (внешние по отношению к сетке данных), которые показывают более подробную информацию о выбранной строке в сетке данных.Это легко сделать с помощью привязки данных или обработки события SelectionChanged в datagrid.

Однако, как мне это сделать, не требуя от пользователя выбора строки - например, при наведении курсора мыши я могу изменить выбранный элемент или получить строку / элемент "под" мышью.

Это было полезно?

Решение 2

Вот более простая, но менее общая реализация ответа Джима.В VB.Net:

Private Sub DataGrid1_LoadingRow(ByVal sender As Object, ByVal e As System.Windows.Controls.DataGridRowEventArgs) Handles DataGrid1.LoadingRow
    AddHandler e.Row.MouseEnter, AddressOf row_MouseEnter
End Sub

Private Sub row_MouseEnter(ByVal sender As Object, ByVal e As MouseEventArgs)
        Dim row = CType(sender, DataGridRow)
        Me.DataGrid1.SelectedItem = CType(row.DataContext, MyType)
End Sub

Другие советы

Попробуйте что-то подобное в вашем классе контейнера, например UserControl, Grid, StackPanel и т.д...

public class MyContainerClass : FrameworkElement
{
    public MyContainerClass()
    {
            base.Loaded += OnLoaded;
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        m_DataGrid.MouseMove += OnMouseMove;
    }

    private void OnMouseMove(object sender, MouseEventArgs e)
    {
        DataGridRow item = (sender as DependencyObject).ParentOfType<DataGridRow>();
        if (item != null && m_DataGrid.SelectedIndex != item.GetIndex())
            m_DataGrid.SelectedIndex = item.GetIndex();
    }
}

И добавьте это расширение вспомогательного класса...

internal static class DependencyObjectExt
{
    // Extension for DependencyObject
    internal static TT ParentOfType<TT>(this DependencyObject element) where TT : DependencyObject
    {
        if (element == null)
            return default(TT);

        while ((element = VisualTreeHelper.GetParent(element)) != null)
        {
            if (element is TT)
                return (TT)element;
        }

        return null;
    }
}

Удачи,
Джим Маккерди
Иньянские деньги

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top