MVVM中三态变量的XAML触发器



我的ViewModel中有一个bool?,它绑定到XAML中的两个RadioButtons

如果属性是truenull,我希望将第一个RadioButton'sIsChecked设置为True,并将第二个RadioButton设置为其倒数。在更新ViewModel中的属性时,我似乎找不到一种方法来实现这一点。

这是我目前的XAML,它并不真正起作用:

<RadioButton Name="RadioButtonDhcpConfig" Grid.Row="1" Grid.Column="1" Content="DHCP" VerticalAlignment="Center" Margin="5">
<RadioButton.Resources>
<Style TargetType="RadioButton">
<Setter Property="IsChecked" Value="{Binding DhcpEnabled}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding DhcpEnabled}" Value="{x:Null}">
<Setter Property="IsChecked" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Resources>
</RadioButton>
<!--Row 2-->
<RadioButton Name="RadioButtonManualConfiguration"  Grid.Row="2" Grid.Column="1" Content="Manual Configuration:" VerticalAlignment="Center" Margin="5">
<RadioButton.Resources>
<Style TargetType="RadioButton">
<Setter Property="IsChecked" Value="{Binding DhcpEnabled}"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding DhcpEnabled}" Value="False">
<Setter Property="IsChecked" Value="True"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding DhcpEnabled}" Value="{x:Null}">
<Setter Property="IsChecked" Value="False"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding DhcpEnabled}" Value="True">
<Setter Property="IsChecked" Value="False"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Resources>
</RadioButton>

如果我从第二个RadioButton中删除所有DataTriggers,则在单击第一个RadioButton时(如预期(会调用DhcpEnabled的setter,但从未调用setter上方的XAML。

这里的问题是,当用户单击第二个RadioButton而无法找到方法时,我需要确保我的DhcpEnabled属性设置为false

如有任何帮助,我们将不胜感激。

下面是第一个按钮的转换器:

public class Bool2NullConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return value == null;
}
if (value is bool?)
{
return (value as bool?).Value;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}  

然后,您可以在RadioButton中这样使用它:
<RadioButton IsChecked="{Binding DhcpEnabled, Converter={StaticResource bool2Null}}">
现在所需要做的就是反转第一个转换器的逻辑,使其成为反相器,并将其应用于第二个RadioButton。它也将使XAML更加干净。

这应该可以工作。对于第一个单选按钮,您可以将默认值设置为true,然后在值为false时使用触发器进行更改。对于第二个控件,只需将其绑定到第一个控件的对立面即可。

<RadioButton Name="RadioButtonDhcpConfig" Grid.Row="1" Grid.Column="1" Content="DHCP" VerticalAlignment="Center" Margin="5">
<RadioButton.Style>
<Style TargetType="RadioButton">
<Setter Property="IsChecked" Value="True"/>
<Style.Triggers>
<DataTrigger Binding="{Binding DhcpEnabled}" Value="False">
<Setter Property="IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
</RadioButton>
<!--Row 2-->
<RadioButton Name="RadioButtonManualConfiguration"  Grid.Row="2" Grid.Column="1" Content="Manual Configuration:" VerticalAlignment="Center" Margin="5">
<RadioButton.Style>
<Style TargetType="RadioButton">
<Setter Property="IsChecked" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=RadioButtonDhcpConfig, Path=IsChecked}" Value="False">
<Setter Property="IsChecked" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
</RadioButton>

在视图模型中添加反转属性(或使用转换器(:

private bool? dhcpEnabled;
public bool? DhcpEnabled
{
get => dhcpEnabled;
set
{
if (dhcpEnabled != value)
{
dhcpEnabled = value;
OnPropertyChanged(nameof(DhcpEnabled));
OnPropertyChanged(nameof(DhcpDisabled));
}
}
}
public bool? DhcpDisabled
{
get => DhcpEnabled == false;
set => DhcpEnabled = !value;
}

然后在XAML中:

请格外注意GroupName属性。

<RadioButton x:Name="RadioButtonDhcpConfig"
GroupName="MyDhcp"
Grid.Row="1" Grid.Column="1" Content="DHCP"
VerticalAlignment="Center" Margin="5"
IsChecked="{Binding DhcpEnabled}"/>
<RadioButton x:Name="RadioButtonManualConfiguration"
GroupName="MyDhcp"
Grid.Row="2" Grid.Column="1"
Content="Manual Configuration:"
VerticalAlignment="Center" Margin="5"
IsChecked="{Binding DhcpDisabled}"/>

最新更新