【问题标题】:how to bind Radio buttons in Silverlight datagrid row and read the selected value for each row in Viewmodel如何绑定 Silverlight 数据网格行中的单选按钮并读取 Viewmodel 中每一行的选定值
【发布时间】:2012-05-11 04:45:33
【问题描述】:

我有一个数据网格,每一行在 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. 如何在 ViewModel 中获取选中的单选按钮值?

提前感谢任何建议。

谢谢。

【问题讨论】:

    标签: mvvm silverlight-4.0 wpfdatagrid


    【解决方案1】:

    (对不起我的英语不好)

    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>
    

    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; }   
    }
    

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

    这对你有用吗?

    【讨论】:

    • 你能解释一下后半部分:在视图模型中读取选定单选按钮的值。
    • 您的FormFieldInformation 是一个项目列表,对吗?在该项目类上,您需要有一个布尔属性来绑定到 RadioButton。对于每个 RadioButton,您都需要一个属性。在我的示例中,我将Radio1IsCheckedRadio2IsChecked 绑定到我的视图。当用户检查收音机时,类上的属性将发生变化。你能向你的班级展示你正在绑定到 dataGrid 吗?
    • 实际上为每一行生成的单选按钮是动态的,每一行可能有不同的单选按钮集。在这种情况下我能做什么。
    • 如果您有任何问题,请告诉我。
    猜你喜欢
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多