我使用从您的请求中可以理解的内容创建了一个快速示例。
SelectAll 会将所有 4 个选项都切换为真,但用户将无法切换全选开关。
我通过禁用SelectAll Switch 并仅在选项之一设置为false时启用它来完成上述操作。为此,我只是绑定了SelectAll属性的反转值。为了反转我使用的值 aConverter
但它也可以使用来自的另一个属性ViewModel
检查这是否适合您。

代码:
视图模型
public class MainViewModel : ViewModelBase
{
private bool option1;
public bool Option1
{
get => option1;
set
{
if (!value) SelectAll = false;
SetProperty(ref option1, value, nameof(Option1));
}
}
private bool option2;
public bool Option2
{
get => option2;
set
{
if (!value) SelectAll = false;
SetProperty(ref option2, value, nameof(Option2));
}
}
private bool option3;
public bool Option3
{
get => option3;
set
{
if (!value) SelectAll = false;
SetProperty(ref option3, value, nameof(Option3));
}
}
private bool option4;
public bool Option4
{
get => option4;
set
{
if (!value) SelectAll = false;
SetProperty(ref option4, value, nameof(Option4));
}
}
private bool selectAll;
public bool SelectAll
{
get => selectAll;
set
{
SetProperty(ref selectAll, value, nameof(SelectAll));
if (value)
{
Option1 = true;
Option2 = true;
Option3 = true;
Option4 = true;
}
}
}
....
}
XAML
<StackLayout Orientation="Vertical"
Padding="20,0"
Spacing="10"
VerticalOptions="CenterAndExpand">
<Switch HorizontalOptions="FillAndExpand"
IsToggled="{Binding Option1}" />
<Switch HorizontalOptions="FillAndExpand"
IsToggled="{Binding Option2}" />
<Switch HorizontalOptions="FillAndExpand"
IsToggled="{Binding Option3}" />
<Switch HorizontalOptions="FillAndExpand"
IsToggled="{Binding Option4}" />
<StackLayout Orientation="Horizontal"
HorizontalOptions="FillAndExpand">
<Switch HorizontalOptions="Start"
IsEnabled="{Binding SelectAll, Converter={StaticResource Invert}}"
IsToggled="{Binding SelectAll}"
VerticalOptions="CenterAndExpand"/>
<Label Text="Select All"
VerticalOptions="CenterAndExpand" />
</StackLayout>
</StackLayout>
但在 XAML 中,您还需要:
<ContentPage.Resources>
<ResourceDictionary>
<local:InvertBooleanConverter x:Key="Invert" />
</ResourceDictionary>
</ContentPage.Resources>
这是转换器注册。
和转换器代码:
public class InvertBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return !(bool)value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return !(bool)value;
}
}
抱歉,我将其Converter
引入了解决方案,但我相信这样更干净。可以在此处查看有关 Xamarin Forms 转换器的更多信息。
希望这可以帮助。-