Телерик Радгрид WPF

На моей странице WPF есть элемент управления RadGrid, предоставленный Telerik. Сетка представляет собой вложенную сетку, что по сути означает, что нажатие на знак (+) в крайнем левом столбце строки расширяет строку до подсетки. Это делается путем указания иерархической сетки в моем XAML. Все работает отлично, когда вы нажимаете на строку и расширяете подсетку, но selectedItem изначально выбранной строки, похоже, не меняется. Например, можно сначала выбрать строку 1 сетки, а затем расширить строку 4, чтобы отобразить вложенную сетку. Вложенная сетка отображается, но selectedItem по-прежнему является строкой 1. Желаемое поведение состоит в том, чтобы строка 4 была selectedItem после того, как она развернута для отображения вложенной сетки. Может ли кто-нибудь указать, что именно здесь происходит не так.

Спасибо


person sc_ray    schedule 20.01.2010    source источник


Ответы (2)


Вы правы - вот обновленная версия:

    private void RadGridView_Loaded(object sender, RoutedEventArgs e)
    {
        var childGrid = (RadGridView)sender;
        var parentRow = childGrid.ParentRow;

        if (parentRow != null)
        {
            RadGridView1.SelectedItem = childGrid.DataContext;
            parentRow.IsExpandedChanged += new RoutedEventHandler(parentRow_IsExpandedChanged);
        }
    }

    void parentRow_IsExpandedChanged(object sender, RoutedEventArgs e)
    {
        RadGridView1.SelectedItem = ((GridViewRow)sender).DataContext;
    }
person Vladimir Enchev    schedule 22.01.2010
comment
Спасибо Влад. Логика действительно выглядит чем-то, что решит проблему. Но похоже, что событие IsExpandedChanged недоступно для parentRow. Был ли он добавлен в более позднюю версию Telerik? - person sc_ray; 22.01.2010
comment
Действительно, это событие добавлено в Q3 2009 SP1 — больше информации здесь: telerik.com/products/wpf/whats-new/release-history/ - person Vladimir Enchev; 25.01.2010

Вот пример:

XAML

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"    
Title="Window1">
<Grid>
    <telerik:RadGridView x:Name="RadGridView1" ItemsSource="{Binding}">
        <telerik:RadGridView.ChildTableDefinitions>
            <telerik:GridViewTableDefinition  />
        </telerik:RadGridView.ChildTableDefinitions>
        <telerik:RadGridView.HierarchyChildTemplate>
            <DataTemplate>
                <telerik:RadGridView ItemsSource="{Binding Items}" Loaded="RadGridView_Loaded" />
            </DataTemplate>
        </telerik:RadGridView.HierarchyChildTemplate>
    </telerik:RadGridView>
</Grid>

C#

using System.Windows;
using System.Linq;

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

            DataContext = from i in Enumerable.Range(0, 10)
                          select new
                          {
                              ID = i,
                              Items = from j in Enumerable.Range(0, 10)
                                      select new
                                      {
                                          ID = j,
                                      }
                          };
        }

        private void RadGridView_Loaded(object sender, RoutedEventArgs e)
        {
            RadGridView1.SelectedItem = ((FrameworkElement)sender).DataContext;
        }
    }
}
person Vladimir Enchev    schedule 21.01.2010
comment
Спасибо, Влад, но событие Loaded срабатывает только при первой загрузке сетки, поэтому щелчок по знаку (+) в первый раз вызывает RadGridView_Loaded, последующие щелчки по той же строке не вызывают событие. Нужно ли связать какое-то другое событие с родительской или дочерней сеткой? - person sc_ray; 21.01.2010