如何绑定 Silverlight 数据网格行中的单选按钮,并读取 Viewmodel 中每一行的选定值



我有一个数据网格,每行在 1 列中有一组单选按钮。我已使用列表框数据模板绑定了这些单选按钮,以动态生成单选按钮。

下面是模板的代码:

<data:DataGrid   x:Name="formTemplate" AutoGenerateColumns="False" GridLinesVisibility="All" HeadersVisibility="All"  ItemsSource="{Binding Path=FormFieldInformation,Mode=TwoWay}"  >
  <data:DataGrid.Columns>
       <data:DataGridTemplateColumn DisplayIndex="1">
              <data:DataGridTemplateColumn.CellTemplate>
                 <DataTemplate>
                      <StackPanel>
                          <RadioButton GroupName="GN1" Content="From" Width="50" 
                                HorizontalAlignment="Left" VerticalAlignment="Center"/>
                       </StackPanel>
                  </DataTemplate>
               </data:DataGridTemplateColumn.CellTemplate>
       </data:DataGridTemplateColumn>
   <data:DataGrid.Columns>
 </data:DataGrid>

但这里有两个问题:1.我只能在为整个数据网格生成的所有单选按钮中选择一个单选按钮。我想每行选择一个单选按钮。2. 如何在视图模型中获取选定的单选按钮值?

任何建议都欢迎提前提出。

谢谢。

(对不起,我的英语不好)

1)您需要为每个RadioButton集提供唯一的GroupName。我认为最简单的方法是将GroupName绑定到将数据网格绑定到的类上的属性。例如,假设你有这样的类:

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Radio1IsChecked { get; set; }
    public bool Radio2IsChecked { get; set; }
}

如果"Id"是唯一的,请将其绑定到GroupName,以便每一行都有不同的行。

2) 要获取选中的值,您必须将RadioButton IsChecked绑定到类上的属性。对于上面的类,它将是这样的:

<DataTemplate>
    <StackPanel Orientation="Horizontal">
        <RadioButton GroupName="{Binding Id}" Content="From" IsChecked="{Binding Radio1IsChecked,Mode=TwoWay}"/>
        <RadioButton GroupName="{Binding Id}" Content="To" IsChecked="{Binding Radio2IsChecked,Mode=TwoWay}"/>
    </StackPanel>
</DataTemplate>

编辑1

我怀疑你发布的 XAML 代码不是你正在运行的实际代码,对吧?在您的CellTemplate上尝试此操作:

<DataTemplate>
<StackPanel>
    <TextBlock Text="{Binding Name}"/>
    <ItemsControl ItemsSource="{Binding Radios}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <RadioButton GroupName="{Binding GroupName}" Content="{Binding Name}" IsChecked="{Binding IsChecked,Mode=TwoWay}"/>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</StackPanel>

现在你的类必须是这样的:

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Radio> Radios { get; set; }
}

public class Radio
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsChecked { get; set; }
    public string GroupName { get; set; }   
}

现在,您可以拥有多个单选按钮(只需将它们添加到 Item.Radios 列表中)。

这对你有用吗?

最新更新