Silverlight在DataGrid中获取选定的行数据

时间:2010-02-03 13:05:52

标签: silverlight datagrid radio-button

在我的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)从网格中与所选单选按钮对应的一个单元格中获取数据。

有一种简单的方法吗?似乎网格上没有行集合。或者我是否必须将其绑定到数据源,然后检查数据源?

非常感谢。

1 个答案:

答案 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)); } 已更改的更复杂情况下,可能需要原始的“过于复杂”的方法。