Silverlight получить данные выбранной строки в DataGrid - PullRequest
2 голосов
/ 03 февраля 2010

В моем приложении Silverlight я определил сетку данных со столбцом шаблона, содержащим переключатель, следующим образом:

XAML:

<data:DataGrid x:Name="Grid1" Margin="8">
    <data:DataGrid.Columns>
        <data:DataGridTemplateColumn Header="RadioButtons">
            <data:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <RadioButton x:Name="rdbIndataGrid" IsChecked="false" GroupName="myGroup" />
                </DataTemplate>
            </data:DataGridTemplateColumn.CellTemplate>
        </data:DataGridTemplateColumn>
    </data:DataGrid.Columns>
</data:DataGrid>

C #

    public MainPage()
    {
        // Required to initialize variables
        InitializeComponent();

        string data = "1,2,3,4,5,6,7,8,9";

        Grid1.ItemsSource = data.Split(',');
    }

Когда нажата кнопка, я хочу иметь возможность:

a) Узнать, какая радиокнопка была выбрана.

b) Получить данные из одной из ячеек в сетке, которая соответствуетвыбранный переключатель.

Есть ли простой способ сделать это?Кажется, на сетке нет коллекции строк.Или мне нужно привязать его к источнику данных и затем проверить источник данных?

Большое спасибо.

1 Ответ

0 голосов
/ 03 февраля 2010

Я бы предпочел сделать это, связав IsChecked со свойством объектов, назначенных ItemSource. Но здесь я покажу вам трудный способ сделать это

( Редактировать : На самом деле следующее слишком сложно для этого сценария, но я пока оставлю его здесь, см. Правки после)

Сначала вам понадобится один из моих методов расширения VisualTreeEnumeration: -

public static class VisualTreeEnumeration
{

    public static IEnumerable<DependencyObject> Ancestors(this DependencyObject root)
    {
        DependencyObject current = VisualTreeHelper.GetParent(root);
        while (current != null)
        {
            yield return current;
            current = VisualTreeHelper.GetParent(current);
        }
    }
}

Теперь в моем тестировании я только что добавил ListBox с именем lstOutput в мой Xaml. Теперь добавьте к вам следующую пару обработчиков событий UserControl: -

    private void rdbIndataGrid_Checked(object sender, RoutedEventArgs e)
    {
        DataGridRow row = ((DependencyObject)sender).Ancestors().OfType<DataGridRow>().FirstOrDefault();
        if (row != null)
            lstOutput.Items.Add(String.Format("Checked: {0}", row.DataContext));
    }

    private void rdbIndataGrid_Unchecked(object sender, RoutedEventArgs e)
    {
        DataGridRow row = ((DependencyObject)sender).Ancestors().OfType<DataGridRow>().FirstOrDefault();
        if (row != null)
            lstOutput.Items.Add(String.Format("Unchecked: {0}", row.DataContext));
    }

и, наконец, настроить кнопку радио Xaml следующим образом: -

<RadioButton x:Name="rdbIndataGrid" IsChecked="false" GroupName="myGroup"
    Checked="rdbIndataGrid_Checked" Unchecked="rdbIndataGrid_Unchecked"  />

(Одна из замечательных особенностей событий Xaml заключается в том, что они работают, даже когда элементы являются частью шаблона).

Вы заметите, что в обработчиках событий я иду по визуальному дереву от отправляющего RadioButton, чтобы найти содержащий DataGridRow. DataGridRow - это объект, который DataContext установлен для объекта, визуализируемого этой строкой. В своем собственном коде вы можете привести значение контекста данных к правильному типу и оттуда получить доступ к другим данным о строке.

Редактировать

На самом деле в большинстве обычных случаев вам не нужно выслеживать владеющий DataGridRow объект, который обращается к свойству DataContext отправляющего RadioButton, достаточно: -

    private void rdbIndataGrid_Checked(object sender, RoutedEventArgs e)
    {
        object myData = ((FrameworkElement)sender).DataContext;

        if (myData != null)
            lstOutput.Items.Add(String.Format("Checked: {0}", myData));
    }

    private void rdbIndataGrid_Unchecked(object sender, RoutedEventArgs e)
    {
        object myData = ((FrameworkElement)sender).DataContext;
        if (myData != null)
            lstOutput.Items.Add(String.Format("Unchecked: {0}", myData));
    }

Следовательно, вы можете отказаться от метода расширения Ancestors. Однако в более сложных случаях, когда DataContext были изменены, может потребоваться оригинальный «слишком сложный» подход.

...