我在绑定RadioButton
属性IsChecked
时遇到了一些问题。我在网格上有两个RadioButton
,Visibility
绑定到我的viewmodel上的属性。我想要实现的是当网格变得可见时,始终将第一个RadioButton
设置为Checked状态。
这是一些代码:
<Grid Visibility="{Binding State, Converter={StaticResource VisibilityConverter}}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<RadioButton Grid.Row="0"
Margin="20,0"
IsChecked="{Binding State, Converter={StaticResource StateToBooleanConverter}}"
Content="content 1" />
<RadioButton Grid.Row="1"
Margin="20,0"
Content="content 2" />
</Grid>
按照我的逻辑,当网格变为可见时,属性RadioButton
进入特定状态时,应首先将State
设置为已检查。它的工作正常,直到我达到第二RadioButton
。然后我的绑定无法正常工作,当State
发生变化时,StateToBooleanConverter
中没有任何变化。
我阅读了很多关于在radiobuttons中绑定问题的信息,但在我的案例中没有任何效果。
是否可以在没有新属性的情况下检查radioButton?如果我能解决这个问题,我将不胜感激。
编辑:
viewmodel和Converter for IsChecked
中有一些代码:
public class MainViewModel : ViewModel
{
public MainViewModel
{
this.ChangeState = new RelayCommand(this.ChangeStateExecute);
}
public PageState State
{
get
{
return this.state;
}
set
{
if (this.state != value)
{
this.state = value;
base.RaisePropertyChanged();
}
}
}
public RelayCommand ChangeState { get; private set; }
private void ChangeStateExecute()
{
this.State = PageState.RadioButtonsVisible;
}
}
public class StateToBooleanConverter : Converter
{
protected override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var state = (PageState)value;
var result = state == PageState.RadioButtonsVisible;
return result;
}
}
答案 0 :(得分:2)
假设PageState是枚举,this answer is what you're looking for.
要组合在一起的所有单选按钮都绑定到ViewModel的相同属性,并且所有单元都使用相同的ValueConverter。触发单选按钮检查/取消选中的值将传递到ValueConverter的parameter
属性中。
针对您的具体问题,EnumBooleanConverter
可以直接复制粘贴到您的代码中(请务必仔细阅读并确保您理解它。)
然后XAML变为
<Grid Visibility="{Binding State, Converter={StaticResource VisibilityConverter}}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<RadioButton Grid.Row="0"
Margin="20,0"
IsChecked="{Binding State, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=RadioButtonVisible}"
Content="content 1" />
<RadioButton Grid.Row="1"
Margin="20,0"
IsChecked="{Binding State, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=*Insert enum value here*}"
Content="content 2" />
</Grid>