Xamarin — 使用 Syncfusion 的 SfPopupLayout 时,在视图模型中设置值后,单选按钮视觉状态不会更新

Xamarin -- Radiobutton visual state doesn't update after setting the value in a viewmodel when using Syncfusion's SfPopupLayout

在使用数据绑定时,我 运行 遇到了一个问题,即单选按钮不会在视觉上更新,但值是正确的。我有一个 RadiobuttonGroup.GroupName 和一个 RadioButtonGroup.SelectedValue。 SelectedValue 通过 {Binding Selection} 数据绑定到我的 ViewModel。选择也在我的 ViewModel 中声明。

每当我将 RadioButton 的选择更改为未选中的按钮时,OnPropertyChanged();熄灭三次。 (我想这是因为视图中有三个按钮,这里可能是错误的。)导致值被选中并移交给我的数据绑定选择。但是按钮的视觉状态并没有改变。单选按钮位于 SfPopupLayout 弹出窗口中。第一次初始化弹出窗口并在视图中提供服务时,它始终按预期工作。但是在随后的每一次服务中,它都会在视觉上出现问题。导致必须多次单击单选按钮才能更改视觉状态。

确实没有发生太多事情,只是 Selection 存储在我的 ViewModel 中。我已经检查了 GitHub 上关于 RadioButtons 和数据绑定的 Xamarin-Examples-Demos,但我无法重现我在演示中遇到的相同问题。

XAML 代码段;

<StackLayout HeightRequest="160"
             Grid.Row="2"
             RadioButtonGroup.GroupName="WeekSelection"
             RadioButtonGroup.SelectedValue="{Binding Selection}">
                <RadioButton Padding="5"
                             BackgroundColor="{DynamicResource BlockBackgroundColor}"       
                             Content="{markup:Translate Week_Selection}"
                             Value="{markup:Translate Week_Selection}"/>
                <BoxView Style="{StaticResource SeperatorLineStyle}"/>
                <RadioButton Padding="5"
                             BackgroundColor="{DynamicResource BlockBackgroundColor}"
                             Content="{markup:Translate TwoWeek_Selection}"
                             Value="{markup:Translate TwoWeek_Selection}"/>
                <BoxView Style="{StaticResource SeperatorLineStyle}"/>
                <RadioButton Padding="5"
                             BackgroundColor="{DynamicResource BlockBackgroundColor}"
                             Content="{markup:Translate Month_Selection}"
                             Value="{markup:Translate Month_Selection}"/>
                <BoxView Style="{StaticResource SeperatorLineStyle}"/>
</StackLayout>

更新:似乎与切换视图有关。每当我进入设置页面更改单选按钮的选择时,OnPropertyChanged();只被解雇一次。但是每当我关闭视图并向它 return 时,它都会触发它两次。随后,每次切换都会增加 OnPropertyChanged() 的次数;叫做。值仍然正常工作,只是视觉状态没有更新。

更新 2:我很确定它与生成的包含单选按钮的弹出窗口有关。这是初始化带有单选按钮的弹出窗口的代码;

        public void ShowAmountOfWeeksPopup()
        {
            _selectWeeksToViewPopupControl = new SelectWeeksToViewPopupControl(this);
            
            _selectWeeksToViewPopupControl.Show();
        }

        public void DismissAmountOfWeeksPopup()
        { 
            _selectWeeksToViewPopupControl.Dismiss();
        }

最终更新:

根据 SyncFusion 的说法,这是一个错误,最终在他们的支持论坛上创建了一个论坛 post,他们最终为我提供了修复程序。如果有人 运行 遇到同样的问题,请参考以下内容 link; https://www.syncfusion.com/forums/171545/radiobuttons-not-working-properly-when-closing-and-re-opening-a-popup

Xamarin -- Radiobutton visual state doesn't update after setting the value in a viewmodel.

我看不到您应用的其他代码。所以我根据示例代码做了测试GroupedRadioButtonsViewModelPage.xaml,但是无法复现这个问题

您可以参考以下代码:

GroupedRadioButtonsViewModelPage.xaml

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="RadioButtonDemos.GroupedRadioButtonsViewModelPage"
             Title="Grouped RadioButtons ViewModel demo">
    <StackLayout Margin="10"
                 RadioButtonGroup.GroupName="{Binding GroupName}"
                 RadioButtonGroup.SelectedValue="{Binding Selection}">
        <Label Text="What's your favorite animal?" />
        <RadioButton Content="Cat"
                     Value="Cat" />
        <RadioButton Content="Dog"
                     Value="Dog" />
        <RadioButton Content="Elephant"
                     Value="Elephant" />
        <RadioButton Content="Monkey"
                     Value="Monkey"/>
        <Label x:Name="animalLabel">
            <Label.FormattedText>
                <FormattedString>
                    <Span Text="You have chosen:" />
                    <Span Text="{Binding Selection}" />
                </FormattedString>
            </Label.FormattedText>
        </Label>


        <Button  Text="test"  Clicked="Button_Clicked"/>
    </StackLayout>
</ContentPage>

GroupedRadioButtonsViewModelPage.xaml.cs

public partial class GroupedRadioButtonsViewModelPage : ContentPage
{

    AnimalViewModel model;
    public GroupedRadioButtonsViewModelPage()
    {
        InitializeComponent();

        model = new AnimalViewModel();
        BindingContext = model;

        //BindingContext = new AnimalViewModel
        //{
        //    GroupName = "animals",
        //    Selection = "Monkey"
        //};
    }

    private void Button_Clicked(object sender, System.EventArgs e)
    {
        model.Selection = "Dog";
    }
}

AnimalViewModel.cs

public class AnimalViewModel : INotifyPropertyChanged
{
    string groupName;
    object selection;


    public AnimalViewModel() {

        GroupName = "animals";
        Selection = "Elephant";
    }

    public string GroupName
    {
        get => groupName;
        set
        {
            groupName = value;
            OnPropertyChanged(nameof(GroupName));
        }
    }

    public object Selection
    {
        get => selection;
        set
        {
            selection = value;
            OnPropertyChanged(nameof(Selection));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

注:

我添加了一个按钮,当点击按钮时,我们可以改变ViewModel(AnimalViewModel)的Selection的值,然后UI会自动刷新。