我有一个装有无线电按钮的群组盒。我怎么知道哪一个是检查的?我正在使用WPF并跟踪MVVM。
<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某种逻辑来计算所选的无线电按钮。
但还有其他优雅的方式吗?
发布于 2013-09-04 14:53:52
您可以将Radiobuttons的RadioButton.Command
绑定到ViewModel的命令,并发送唯一的CommandParameter来标识哪个按钮在命令处理程序中调用了该命令。
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio1"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio2"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio3"/>
在命令处理程序中,检查参数以识别无线电按钮。
谢谢
发布于 2013-09-04 15:10:05
您可以创建一个enum
,它将RadioButton
对象的值作为名称(粗略地)包含,然后使用EnumToBoolConverter
将IsChecked
属性绑定到该enum
类型的属性。
public enum Options
{
All, Current, Range
}
然后在您的视图中,模型或代码后面:
private Options options = Options.All; // set your default value here
public Options Options
{
get { return options; }
set { options = value; NotifyPropertyChanged("Options"); }
}
添加Converter
[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
<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
。
发布于 2014-07-10 19:13:20
还有一种使用IsChecked属性解决此问题的MVVM方法。
这是XAML
<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>
你的模型会是这样的
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看起来像这样(选择逻辑)
RadioButtonQuestion r = new RadioButtonQuestion();
var selectedElement = rbuttonQuestion.answerOptions.FirstOrDefault(c => c.IsChecked);
r.answer = selectedElement.individualRadioButtonText;
因此,如果将视图的数据文本设置为此视图模型。你一定能让它开始工作。
希望能帮上忙。
https://stackoverflow.com/questions/18616721
复制相似问题