Динамически добавлять UserControls в настраиваемый Xamarin ListView с помощью привязываемого свойства - PullRequest
1 голос
/ 09 июля 2020

Я уже создал все элементы управления и проверил, что элементы управления добавляются по мере необходимости без использования привязки.

Проблема возникает, как только я добавляю привязку, которая должна определять, какой элемент управления Чтобы добавить, элементы управления перестают работать по мере необходимости.

Элемент управления представления списка будет заполнен из коллекции класса, который будет иметь поле индикатора, чтобы определить, какой элемент управления необходимо загрузить. Представление списка содержит второй пользовательский элемент управления, который в основном действует как заполнитель для правильного элемента управления, он имеет свойство привязки типа text, которое установлено для определения правильного элемента управления для загрузки.

Вот код XAML для элемента управления в виде списка

    <ContentView.Content>
        <StackLayout>
            <Label Text="Binding Control Type"/>
            <Entry x:Name="cntName"/>
            <ListView  x:Name="GroupedView" GroupDisplayBinding="{Binding Title}" HasUnevenRows="True" GroupShortNameBinding="{Binding ShortName}" IsGroupingEnabled="True">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <ViewCell.ContextActions>
                                <MenuItem Text="Add Comment"/>
                                <MenuItem Text="Add Attachment"/>
                            </ViewCell.ContextActions>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="3*"/>
                                    <ColumnDefinition Width="7*"/>
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="3*"/>
                                    <RowDefinition Height="7*"/>
                                </Grid.RowDefinitions>
                                <Label Text="{Binding QUESTION_ID}" Grid.Row="0" Grid.Column="0" VerticalTextAlignment="Center" FontSize="Medium"/>
                                <Label Text="{Binding QUESTION_DETAILS}" Grid.Row="1" Grid.Column="0" VerticalTextAlignment="Center" FontSize="Medium"/>
                                <con:ucListViewControls ControlType="{Binding QUESTION_ANSWERCONTROL}" Grid.Row="1" Grid.Column="1"/>
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
                <ListView.GroupHeaderTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <ViewCell.ContextActions>
                                <MenuItem Text="Add Comment"/>
                                <MenuItem Text="Add Attachment"/>
                            </ViewCell.ContextActions>
                            <StackLayout Orientation="Horizontal" Padding="5,5,5,5" BackgroundColor="#E2F5F9">
                                <StackLayout.GestureRecognizers>
                                    <TapGestureRecognizer Command="{Binding Source={x:Reference this}, Path=Tapped}" CommandParameter="{Binding .}"/>
                                </StackLayout.GestureRecognizers>
                                <Button Image="{Binding StateIcon}" BackgroundColor="Transparent" BorderColor="Transparent" BorderWidth="0"/>
                                <Label Text="{Binding Title}" TextColor="#005569" FontSize="15" VerticalOptions="Center"/>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.GroupHeaderTemplate>
            </ListView>
        </StackLayout>
    </ContentView.Content>

И код для элемента управления

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ucExpandibleListView : ContentView
    {
        private ObservableCollection<dbQuestionGroup> _allGroups;
        private ObservableCollection<dbQuestionGroup> _expandedGroups;

        public ucExpandibleListView()
        {
            InitializeComponent();

            Tapped = new Command(x => HeaderTapped(x));

            _allGroups = new ObservableCollection<dbQuestionGroup>()
            {
                new dbQuestionGroup("Category 1", "C1", false)
                {
                    new dbQuestionModel() { QUESTION_ID = 1, QUESTION_DETAILS = "Testing Question 1", QUESTION_ANSWERCONTROL = "RBL" },
                    new dbQuestionModel() { QUESTION_ID = 2, QUESTION_DETAILS = "Testing Question 2", QUESTION_ANSWERCONTROL = "" }
                }
        };
            UpdateListContent();
        }

        private void UpdateListContent()
        {
            _expandedGroups = new ObservableCollection<dbQuestionGroup>();

            foreach (dbQuestionGroup group in _allGroups)
            {
                dbQuestionGroup newGroup = new dbQuestionGroup(group.Title, group.ShortName, group.Expanded);
                newGroup.QuestionCount = group.Count;

                if (group.Expanded)
                {
                    foreach (dbQuestionModel question in group)
                    {
                        newGroup.Add(question);
                    }
                }
                _expandedGroups.Add(newGroup);
            }
            GroupedView.ItemsSource = _expandedGroups;
        }

        public Command Tapped { get; set; }

        private void HeaderTapped(object group)
        {
            var groupCat = (dbQuestionGroup)group;
            int selectedIndex = _expandedGroups.IndexOf(groupCat);

            if (groupCat.Expanded)
            {
                _allGroups[selectedIndex].Expanded = false;
            }
            else
            {
                _allGroups.ToList().ForEach(x => x.Expanded = false);
                _allGroups[selectedIndex].Expanded = !_allGroups[selectedIndex].Expanded;
            }

            UpdateListContent();
        }
    }

Вот код XAML для элемента управления-заполнителя

  <ContentView.Content>
      <StackLayout x:Name="stkPlaceholder">
      </StackLayout>
  </ContentView.Content>

И код для элемента управления-заполнителя

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ucListViewControls : ContentView, INotifyPropertyChanged
    {
        public ucListViewControls()
        {
            InitializeComponent();
        }

        #region Control Attributes
        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged(string info)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
        }
        #endregion

        #region Bindable Properties
        public static readonly BindableProperty ControlTypeProperty = BindableProperty.Create(nameof(ControlType), typeof(string), typeof(ucListViewControls));

        public string ControlType
        {
            get
            {
                return (string)GetValue(ControlTypeProperty);
            }
            set
            {
                SetValue(ControlTypeProperty, value);
                AddControl();
                NotifyPropertyChanged("ControlType");
            }
        }
        #endregion

        public void AddControl()
        {
            switch (ControlType)
            {
                case "RBL":
                    ucRadiobuttons radiobuttons = new ucRadiobuttons();
                    radiobuttons.lblTitle1 = "Yes";
                    radiobuttons.lblTitle2 = "No";
                    radiobuttons.lblTitle3 = "N/A";

                    radiobuttons.OnColor1 = Color.Green;
                    radiobuttons.OnColor2 = Color.Red;
                    radiobuttons.OnColor3 = Color.Transparent;
                    stkPlaceholder.Children.Add(radiobuttons);
                    break;
                default:
                    Entry placeholder = new Entry();
                    stkPlaceholder.Children.Add(placeholder);
                    break;
            }
        }
    }

Я проверил, что элементы управления добавляются без привязки, что отлично работает.

Я несколько раз пытался переписать связываемое свойство на случай, если я что-то пропустил, я также не смог найти ни одного сообщения, относящегося к чему-то похожему, что помогло бы мне.

Любые подсказки?

Первый снимок экрана показывает ожидаемый результат, а скриншоты секунд показывают, что происходит, когда привязка прилагается.

enter image description hereenter image description here

dbQuestionModel:

using System.Collections.Generic;

namespace PivotMobile_BusinessLayer.Models
{
    public class dbQuestionModel
    {
        public int QUESTION_PK { get; set; }

        public int QUESTION_ID { get; set; }

        public string QUESTION_CATEGORY { get; set; }

        public string QUESTION_DETAILS { get; set; }

        public string QUESTION_TYPE { get; set; }

        public string QUESTION_ANSWERCONTROL { get; set; }

        public string QUESTION_COMMENT { get; set; }

        public List QUESTION_ATTACHMENTS { get; set; }
    }
}

dbQuestionGroup:

using System.Collections.ObjectModel;
using System.ComponentModel;

namespace PivotMobile_BusinessLayer.Models
{
    public class dbQuestionGroup : ObservableCollection, INotifyPropertyChanged
    {
        public static ObservableCollection All { private set; get; }

        private bool _expanded;

        public string Title { get; set; }

        public string ShortName { get; set; }

        public bool Expanded
        {
            get
            {
                return _expanded;
            }
            set
            {
                if (_expanded != value)
                {
                    _expanded = value;
                    OnPropertyChanged("Expanded");
                    OnPropertyChanged("StateIcon");
                }
            }
        }

        public string StateIcon
        {
            get
            {
                return Expanded ? "expanded_blue.png" : "collapsed_blue.png";
            }
        }

        public int QuestionCount { get; set; }

        public dbQuestionGroup(string title, string shortName, bool expanded = true)
        {
            Title = title;
            ShortName = shortName;
            Expanded = expanded;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

ListView Page XAML:

<?xml version="1.0" encoding="utf-8" ?>
   

Код страницы ListView позади:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace PivotMobile.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ObservationsView : ContentPage
    {
        public ObservationsView ()
        {
            InitializeComponent ();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...