2010-02-03 2 views
2

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

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> 

С #

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

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

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

При нажатии кнопки Я хочу, чтобы быть в состоянии:

a) Узнайте, какой радиобус tton.

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

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

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

ответ

0

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

(Edit: На самом деле следующим более сложным для этого сценария, но я оставлю это здесь сейчас, см редактируют после)

Первых вам нужен один из моих методов расширения 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)); 
    } 

и, наконец, настроить кнопку Radio 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, может потребоваться исходный «чрезмерно сложный» подход.

Смежные вопросы