我有一组通过ItemTemplate创建的单选按钮.我想在单击按钮时重置当前选中的单选按钮.请帮助我了解在MVVM架构中,当我使用ItemTemplate时,关于当前 Select 的单选按钮的信息隐藏在哪里.以及如何移除所述 Select .

我安装了NuGet社区工具包.Mvvm,并创建了一个GitHub存储库,其中包含以下所有代码:https://github.com/jacobfredsoee/ItemTemplateResetHelp

MainPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ItemTemplateReset.View.MainPage"
             xmlns:model="clr-namespace:ItemTemplateReset.Model">

    <ScrollView>
        <VerticalStackLayout
            Padding="20">
            <Label Text="Role type:"/>
            <VerticalStackLayout>
                <CollectionView ItemsSource="{Binding PickableRoles}">
                    <CollectionView.ItemTemplate>
                        <DataTemplate x:DataType="model:PickableRole">
                            <RadioButton Content="{Binding Name}" 
                                            Value="{Binding Id}"
                                            CheckedChanged="OnRoleChange"/>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
            </VerticalStackLayout>

            <Label Text="{Binding SelectedRole, StringFormat='Selected Role: {0}'}" x:Name="SelectedRole"/>

            <Button
                x:Name="ResetButton"
                Text="Click me to reset"
                Clicked="OnResetClicked"
                HorizontalOptions="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>

代码背后,MainPage.xaml.cs

namespace ItemTemplateReset.View;

public partial class MainPage : ContentPage
{
    MainPageViewModel viewModel;
    public MainPage(MainPageViewModel viewModel)
    {
        InitializeComponent(); 
        BindingContext = viewModel;
        this.viewModel = viewModel;
    }

    private void OnResetClicked(object sender, EventArgs e) {
        //How to reset the radio buttons so that none is selected?
        viewModel.SelectedRole = -1; //This does not work
    }

    private void OnRoleChange(object sender, CheckedChangedEventArgs e) {
        RadioButton rb = sender as RadioButton;
        viewModel.SelectedRole = int.Parse(rb.Value.ToString());
    }
}


The ViewModel,MainPageViewModel.cs:

namespace ItemTemplateReset.ViewModel;

public partial class MainPageViewModel : ObservableObject
{
    public ObservableCollection<PickableRole> PickableRoles { get; set; } = new();

    [ObservableProperty]
    public int selectedRole = -1;

    public MainPageViewModel() {
        SetPickableRoles();
    }

    private void SetPickableRoles() {
        PickableRoles.Add(new PickableRole() { Id = 1, Name = "Role 1"} );
        PickableRoles.Add(new PickableRole() { Id = 2, Name = "Role 2" });
        PickableRoles.Add(new PickableRole() { Id = 3, Name = "Role 3" });
        PickableRoles.Add(new PickableRole() { Id = 4, Name = "Role 4" });
        PickableRoles.Add(new PickableRole() { Id = 5, Name = "Role 5" });
    }
}

最后,模型PickableRole.cs

namespace ItemTemplateReset.Model;

public class PickableRole
{
    public string Name { get; set; }

    public int Id { get; set; }
}

推荐答案

在你的模型上加SelectedProperty

public partial class PickableRole : ObservableObject
{
    public string Name { get; set; }

    public int Id { get; set; }

    [ObservableProperty]
    private bool selected;
}

然后将每RadioButtoon个绑定在一起

<RadioButton Content="{Binding Name}" 
         Value="{Binding Id}"
         IsChecked="{Binding Selected}" />

然后向您的VM添加一个方法

public void ResetRoles()
{
    foreach(var pr in PickableRoles)
    {
        pr.Selected = false;
    }
}

从您的按钮处理程序调用的

private void OnResetClicked(object sender, EventArgs e) {
    viewModel.ResetRoles();
}

您还可以将RadioButtonGroup.SelectedValue属性绑定到您的VM,这样就不需要在每个RadioButton上使用事件处理程序

Csharp相关问答推荐

当打印一行x个项目时,如何打印最后一行项目?

. NET在上一个操作完成之前,在此上下文实例上启动了第二个操作

Blazor-从数据库内部服务器提取错误

MAUI查询参数单一字符串项将不起作用

如何在没有额外副本的情况下将存储在IntPtr下的原始图像数据写入WinUI3中的Image控件?

StackExchange.Redis.RedisServerException:调用ITransaction.ExecuteAsync()时出现错误未知命令取消监视

更改执行目录

调用Task.Run()与DoSomethingAsync()有什么不同?

使用泛型可空类实现接口

我如何让我的秒表保持运行场景而不重置

单元测试:模拟返回空

BlockingCollection T引发意外InvalidOperationException

有空容错运算符的对立面吗?

为什么我的用户界面对象移动到略低于实际目标?

我想根据姓氏按字母顺序对包含150行徽章编号、姓氏、名字、地址等的文件进行排序.e

在C#和HttpClient中使用REST API

为什么Visual Studio 2022建议IDE0251将我的方法设置为只读?

为什么INTEGER在通过反射调用时对空对象返回TRUE,而在INTEGER上调用时返回FALSE?

从具有泛型类型约束的类继承-Blazor

从列表中跳过和获取条目的优雅方式