WPF中数据绑定单选按钮列表的最简单方法是什么?

本文关键字:最简单 方法 是什么 列表 数据绑定 单选按钮 WPF | 更新日期: 2023-09-27 17:50:43

首先,我是WPF的新手,我正在使用MVVM Light Toolkit,大约2天了,我正在互联网上寻找一种简单的方法来创建一个单选按钮列表。我发现许多例子在我看来要么太复杂,要么是对一些老bug的"hack",甚至是不能工作的例子。

假设在你的代码中有一个字符串列表

List<string> options = new List<string>();
        options.Add("option 1");
        options.Add("option 2");
        options.Add("option 3");
        options.Add("option 4");

所以我想问你,用options创建单选按钮列表的最简单方法是什么?

WPF中数据绑定单选按钮列表的最简单方法是什么?

我想,最简单的是:

<ItemsControl ItemsSource="{Binding Options}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <RadioButton Content="{Binding}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

其中Options是数据上下文的属性,如下所示:

public IEnumerable<string> Options
{
    get { return options; }
}

但是我认为,你会想要得到选择结果。
因此,任务变得更加复杂。您需要视图模型:

public class OptionViewModel
{
    public bool? IsChecked { get; set; }
    public string OptionName { get; set; }
}

然后,您必须将字符串列表转换为视图模型列表:

public IEnumerable<OptionViewModel> Options
{
    get { return optionsAsViewModels ?? (optionsAsViewModels = new List(options.Select(_ => new OptionViewModel { OptionName = _ }))); }
}
private IEnumerable<OptionViewModel> optionsAsViewModels;

并对项目模板做一些修改:

<ItemsControl ItemsSource="{Binding Options}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <RadioButton Content="{Binding OptionName}" IsChecked="{Binding IsChecked}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

试试下面的代码示例:-

 <DataTemplate>
               <RadioButton GroupName="Test"
                            Content="{Binding ItemDescription}"
                            IsChecked="{Binding IsSelected}"
                            Margin="5,1"/>
           </DataTemplate>

和在服务器端:-

public ViewModel()
        {
            Test = new Collection<SelectableItem>
                {
                    new SelectableItem { ItemDescription = "Option 1"},
                    new SelectableItem { ItemDescription = "Option 2"},
                    new SelectableItem { ItemDescription = "Option 3", IsSelected = true},
                    new SelectableItem { ItemDescription = "Option 4"}
                };
        }

public class SelectableItem : INotifyPropertyChanged
    {
        public string ItemDescription { get; set; }
        public bool IsSelected { get; set; }
    }