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