首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视图模型中RadioBox集GroupName的Xamarin列表

视图模型中RadioBox集GroupName的Xamarin列表
EN

Stack Overflow用户
提问于 2022-06-23 20:09:21
回答 1查看 64关注 0票数 0

到目前为止,我找到的所有RadioButtons示例的值都是在页面的xaml中硬编码的。我希望(目前)从数据库中输入一个字符串列表,并在GroupName中遇到问题。

代码语言:javascript
复制
My data template for a radio display type:

            <DataTemplate x:Key="RadioTemplate">
                <StackLayout>
                    <Label 
                        Text="{Binding Name}"
                        Style="{StaticResource LabelStyle}">
                    </Label>
                    <ListView ItemsSource="{Binding Choices.Choices}">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell>
                                    <RadioButton Value="{Binding}"
                                            Content="{Binding}"
                                            GroupName="someGroupName"
                                            CheckedChanged="OnRadioChanged">
                                    </RadioButton>
                                </ViewCell>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </StackLayout>
            </DataTemplate>


MainPageViewModel.cs
using System;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Xamarin.Forms;
using FieldDataTemplateSelectorSample.Validations;

namespace FieldDataTemplateSelectorSample
{
    public class MainPageViewModel : ValidationViewModelBase
    {
        public MainPageViewModel()
        {
            _fields = new ObservableCollection<FieldViewModel>();
        }

        private ObservableCollection<FieldViewModel> _fields;
        public ObservableCollection<FieldViewModel> Fields
        {
            get { return _fields; }
            set
            {
                _fields = value;
                RaisePropertyChanged();
            }
        }

        private bool _showValidationSummary;
        public bool ShowValidationSummary
        {
            get { return _showValidationSummary; }
            set
            {
                _showValidationSummary = value;
                RaisePropertyChanged();
            }
        }

        ICommand _submitCommand;
        public ICommand SubmitCommand
        {
            get => _submitCommand ?? (_submitCommand = new Command(ValidateAndSave));
        }

        private void ValidateAndSave(object obj)
        {
            ValidateAll();
            if (ErrorStateManager.HasError)
            {
                ShowValidationSummary = true;
            }
            else
            {
                ShowValidationSummary = false;
            }
        }
    }
}

using System.Collections.Generic;
using Xamarin.Forms;
using FieldDataTemplateSelectorSample.Validations;


namespace FieldDataTemplateSelectorSample
{
    public class FieldViewModel : ValidationViewModelBase
    {
        public FieldViewModel()
        {
            _choices = new ChoiceViewModel();
        }

        private string _value;

        public long Id { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }
        public string Code { get; set; }
        public string Value 
        { 
            get
            {
                return _value;
            }           
            set
            {
                _value = value;
                RaisePropertyChanged();
                Validate();
            }
        }
        public string PlaceholderText { get; set; }
        public int SortOrder { get; set; }
        public string DisplayType { get; set; }
        public bool IsReadOnly { get; set; }
        public bool IsEnabled { get; set; }

        private ChoiceViewModel _choices;
        public ChoiceViewModel Choices
        {
            get 
            { 
                return _choices; 
            }
            set 
            { 
                _choices = value; 
                RaisePropertyChanged(); 
            }
        }

        void OnChoicesRadioButtonCheckedChanged(object sender, CheckedChangedEventArgs e)
        {
            // what else do we need to do?  Update value?
            
            RaisePropertyChanged();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace FieldDataTemplateSelectorSample
{
    public class ChoiceViewModel
    {
        public ChoiceViewModel()
        {
            Choices = new List<string>();
        }

        public string Code { get; set; }
        public List<string> Choices { get; set; }
    }
}

只要我对GroupName中的RadioButton进行硬编码,一切都会正常工作,但我最终会为页面上的每个单选按钮取一个组名。我尝试将该属性添加到模板中的StackLayout中:

代码语言:javascript
复制
<StackLayout RadioButtonGroup.GroupName="someGroup">

并将其从RadioButton中取出,但是当我在OnRadioChanged中放置一个断点时,GroupName作为null出现。

我想使用ChoiceViewModel中的correct作为组名,但是还没有得到相对绑定的正确性。任何帮助的绑定或不同的方式来做DataTemplate将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-24 13:00:18

您可以使用一个可绑定的StackLayout,它将使您对容器具有更多的控制权。

代码语言:javascript
复制
<StackLayout>
    <Label Text="{Binding Name}" Style="{StaticResource LabelStyle}" />
    <StackLayout RadioButtonGroup.GroupName="{Binding Name}"      
           BindableLayout.ItemsSource="{Binding Choices.Choices}" >
       <BindableLayout.ItemTemplate>
         <DataTemplate>
           <ViewCell>
               <RadioButton Value="{Binding}" Content="{Binding}"
                   CheckedChanged="OnRadioChanged" />
           </ViewCell>
         </DataTemplate>
      </BindableLayout.ItemTemplate>
  </StackLayout>
</StackLayout>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72736046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档