【问题标题】:Create a Radio Button group using standard buttons使用标准按钮创建单选按钮组
【发布时间】:2020-10-10 13:22:57
【问题描述】:

这里的想法很简单,我有 2 个或更多按钮,并希望它们像单选按钮一样工作。因此,任何时候都只能检查一个,当一个被检查时,其他人必须取消检查自己。我正在使用 MVVM,所以不想走后面的代码路线,尽管这样做会更容易。

这是我尝试过的 XAML,由于按钮相互引用而被锁定。

    <Label Text="Group Header Sorting" TextColor="{DynamicResource InverseTextColor}"/>
    <StackLayout Orientation="Horizontal" Spacing="0">
        <buttons:SfButton x:Name="GroupHeaderSortAscButton" Text="Ascending" HeightRequest="35" WidthRequest="90" IsChecked="{Binding Source={x:Reference GroupHeaderSortDescButton}, Path=IsChecked, Converter={converters:InverseBoolConverter}}">
        </buttons:SfButton>

        <buttons:SfButton x:Name="GroupHeaderSortDescButton" Text="Descending" HeightRequest="35" WidthRequest="90" IsChecked="{Binding Source={x:Reference GroupHeaderSortAscButton}, Path=IsChecked, Converter={converters:InverseBoolConverter}}">
        </buttons:SfButton>
    </StackLayout>

我也尝试过数据触发器并取得了更大的成功,但它仍然不完美,因为它需要在开始工作之前按下两次未选择的按钮。

        <StackLayout Orientation="Horizontal" Spacing="0">
            <buttons:SfButton x:Name="GroupHeaderSortAscButton" Text="Ascending" HeightRequest="35" WidthRequest="90" IsChecked="False">
                <buttons:SfButton.Triggers>
                    <DataTrigger TargetType="buttons:SfButton" Binding="{Binding Source={x:Reference GroupHeaderSortDescButton}, Path=IsChecked}" Value="True">
                        <Setter Property="IsChecked" Value="False"/>
                    </DataTrigger>
                    <DataTrigger TargetType="buttons:SfButton" Binding="{Binding Source={x:Reference GroupHeaderSortDescButton}, Path=IsChecked}" Value="False">
                        <Setter Property="IsChecked" Value="True"/>
                    </DataTrigger>
                </buttons:SfButton.Triggers>
            </buttons:SfButton>

            <buttons:SfButton x:Name="GroupHeaderSortDescButton" Text="Descending" HeightRequest="35" WidthRequest="90" IsChecked="True">
                <buttons:SfButton.Triggers>
                    <DataTrigger TargetType="buttons:SfButton" Binding="{Binding Source={x:Reference GroupHeaderSortAscButton}, Path=IsChecked}" Value="True">
                        <Setter Property="IsChecked" Value="False"/>
                    </DataTrigger>
                    <DataTrigger TargetType="buttons:SfButton" Binding="{Binding Source={x:Reference GroupHeaderSortAscButton}, Path=IsChecked}" Value="False">
                        <Setter Property="IsChecked" Value="True"/>
                    </DataTrigger>
                </buttons:SfButton.Triggers>
            </buttons:SfButton>
        </StackLayout>

我知道他们从 XF 4.6 开始引入 RadioButton 控件,我已经尝试过这个及其错误,根据 Git Hub 上的 cmets 它将在 XF 5 中发生重大变化,所以我不想实现这个实验版。

这就是我想要的样子:

【问题讨论】:

  • 如果您已经在使用 SF 控件,为什么不使用他们的 RadioButton?
  • 是的,我可以做到,但我正在尝试实现与收音机中常见的小圆圈不同的风格。我已经更新了我的帖子以展示设计。
  • 那个是分段控件,不是单选按钮——SF也有,开源的选项也很丰富
  • 感谢您指出该控件,我会看看,但似乎我可以使用它。我仍然会保留这个问题,因为我想看到答案。
  • 为什么不尝试在按钮绑定上下文的设置器部分以编程方式处理它。单击一个按钮时,更改另一个按钮的状态。只需几行代码,您就可以得到您想要的

标签: xaml xamarin.forms syncfusion radio-group


【解决方案1】:

我们已经通过使用 Syncfusion SfButton 实现了您的要求。要使其成为切换类型,需要将 IsCheckable 属性设置为 True。然后只有它会正确更新 IsChecked 属性。为了保持单一选择,我们通过在内部包含 GroupKey 并进一步验证来扩展 SfButton。

CustomRadioButton

【讨论】:

    【解决方案2】:

    我希望能够使用标准按钮和 XAML 来做到这一点,并避免使用 3rd 方控件,仅此而已。

    我最终使用了 Syncfusion 的 SfSegmentedControl,它工作得相当好,但这是一个付费的 3rd 方控件。

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      相关资源
      最近更新 更多