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会自动刷新。
在使用数据绑定时,我 运行 遇到了一个问题,即单选按钮不会在视觉上更新,但值是正确的。我有一个 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会自动刷新。