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