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

时间:2012-05-01 17:09:24

标签: mvvm silverlight-4.0 wpfdatagrid

我有一个数据网格,每行在一列中有一组单选按钮。我使用listbox datatemplate绑定了这些单选按钮,以便动态生成Radiobuttons。

以下是模板的代码:

<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.如何在ViewModel中获取所选的radiobuttons值?

任何建议都需要提前感谢。

感谢。

1 个答案:

答案 0 :(得分:1)

(抱歉我的英语不好)

1)您需要为每个GroupName集提供唯一的RadioButton。我认为最简单的方法是将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>

<强> EDIT1

我说你发布的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; }   
}

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

这对你有用吗?