我更喜歡這樣做的方式是將IsChecked
綁定到分配給ItemsSource的對象的屬性。但在這裏我會告訴你的硬盤的方式來做到這一點
(編輯:其實下面是過於複雜對於這種情況,但我會離開這裏,現在,看到編輯後)
第一你需要我的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);
}
}
}
現在在我的測試中,我剛剛添加名爲lstOutput
一個ListBox
我的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
對象訪問發送RadioButton
的DataContext
屬性是足夠了: -
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
已被更改,可能需要原來的「過度複雜」方法。