首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVVM下WPF中从群框中确定选中的Radiobutton

MVVM下WPF中从群框中确定选中的Radiobutton
EN

Stack Overflow用户
提问于 2013-09-04 14:35:27
回答 5查看 42.6K关注 0票数 15

我有一个装有无线电按钮的群组盒。我怎么知道哪一个是检查的?我正在使用WPF并跟踪MVVM。

代码语言:javascript
运行
复制
<GroupBox Name="grpbx_pagerange" Header="Print Range">
    <Grid >
        <RadioButton Name="radbtn_all" Content="All Pages" GroupName="radios_page_range" IsChecked="True"  />
        <RadioButton x:Name="radbtn_curr" Content="Current Page" GroupName="radios_page_range"  />
        <RadioButton Name="radbtn_pages" Content="Page Range" GroupName="radios_page_range" />

        ....

</GroupBox>

现在,我可以找到的一种方法是将每个radiobutton的IsChecked属性绑定到ViewModel中的一些属性,然后在ViewModel中执行if..else某种逻辑来计算所选的无线电按钮。

但还有其他优雅的方式吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-09-04 14:53:52

您可以将Radiobuttons的RadioButton.Command绑定到ViewModel的命令,并发送唯一的CommandParameter来标识哪个按钮在命令处理程序中调用了该命令。

代码语言:javascript
运行
复制
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio1"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio2"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio3"/>

在命令处理程序中,检查参数以识别无线电按钮。

谢谢

票数 36
EN

Stack Overflow用户

发布于 2013-09-04 15:10:05

您可以创建一个enum,它将RadioButton对象的值作为名称(粗略地)包含,然后使用EnumToBoolConverterIsChecked属性绑定到该enum类型的属性。

代码语言:javascript
运行
复制
public enum Options
{
    All, Current, Range
}

然后在您的视图中,模型或代码后面:

代码语言:javascript
运行
复制
private Options options = Options.All; // set your default value here

public Options Options
{ 
    get { return options; }
    set { options = value; NotifyPropertyChanged("Options"); }
}

添加Converter

代码语言:javascript
运行
复制
[ValueConversion(typeof(Enum), typeof(bool))]
public class EnumToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || parameter == null) return false;
        string enumValue = value.ToString();
        string targetValue = parameter.ToString();
        bool outputValue = enumValue.Equals(targetValue, StringComparison.InvariantCultureIgnoreCase);
        return outputValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || parameter == null) return null;
        bool useValue = (bool)value;
        string targetValue = parameter.ToString();
        if (useValue) return Enum.Parse(targetType, targetValue);
        return null;
    }
}

最后,在UI中添加绑定,设置适当的ConverterParameter

代码语言:javascript
运行
复制
<RadioButton Content="All Pages" IsChecked="{Binding Options, Converter={
    StaticResource EnumToBoolConverter}, ConverterParameter=All}" />
<RadioButton Content="Current Page" IsChecked="{Binding Options, Converter={
    StaticResource EnumToBoolConverter}, ConverterParameter=Current}" />
<RadioButton Content="Page Range" IsChecked="{Binding Options, Converter={
    StaticResource EnumToBoolConverter}, ConverterParameter=Range}" />

现在,您可以通过查看视图模型中的Options变量或后面的代码来判断哪些设置。还可以通过设置RadioButton属性来设置选中的Options

票数 20
EN

Stack Overflow用户

发布于 2014-07-10 19:13:20

还有一种使用IsChecked属性解决此问题的MVVM方法。

这是XAML

代码语言:javascript
运行
复制
<Page>
<Page.Resources>
<DataTemplate x:Key="ChoiceItemTemplate">
<RadioButton Content="{Binding individualRadioButtonText}"
     IsTabStop="True"
     GroupName="choice"
     IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
 </DataTemplate>
</Page.Resources>


 <StackPanel>
  <TextBlock Text="{Binding ChoiceQuestion}" />
 <ItemsControl  ItemsSource="{Binding ListOfAnswerOptions}"
                ItemTemplate="{StaticResource ChoiceItemTemplate}" />
 </StackPanel>
</Page>

你的模型会是这样的

代码语言:javascript
运行
复制
 public class RadioButtonQuestion
 {
    public string ChoiceQuestion { get; set; }
    public string answer { get; set; }
    public List<AnswerOption> ListOfAnswerOptions { get; set; }
 }

 public class AnswerOption
 {
    public string individualRadioButtonText { get; set; }
    public bool IsChecked { get; set; }
 }

ViewModel看起来像这样(选择逻辑)

代码语言:javascript
运行
复制
RadioButtonQuestion r = new RadioButtonQuestion();
var selectedElement = rbuttonQuestion.answerOptions.FirstOrDefault(c => c.IsChecked);
r.answer = selectedElement.individualRadioButtonText;

因此,如果将视图的数据文本设置为此视图模型。你一定能让它开始工作。

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18616721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档