在我的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>
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)从网格中与所选单选按钮对应的一个单元格中获取数据。
有一种简单的方法吗?似乎网格上没有行集合。或者我是否必须将其绑定到数据源,然后检查数据源?
非常感谢。
答案 0 :(得分:0)
我更喜欢这样做的方法是将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);
}
}
}
现在,在我的测试中,我刚刚向我的Xaml添加了名为ListBox
的{{1}}。现在向您lstOutput
添加以下几个事件处理程序: -
UserControl
最后像这样调整单选按钮Xaml: -
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" />
的可视树中走过来,找到包含RadioButton
的内容。 DataGridRow
是其DataGridRow
设置为该行呈现的对象的对象。在您自己的代码中,您可以将数据上下文值强制转换为正确的类型,然后从中访问有关该行的其他数据。
修改强>
实际上,在大多数普通情况下,您不需要访问拥有DataContext
对象,访问发送DataGridRow
的{{1}}属性就足够了: -
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));
}
已更改的更复杂情况下,可能需要原始的“过于复杂”的方法。