用项目填充SelectableItemsView

时间:2019-07-04 19:20:21

标签: c# xamarin.forms

我试图将一个selectableItemsView放在一起以填充对象列表,由于某种原因,我没有让任何项目显示在SelectableItemsView中;我只能在项目应该放置的地方留白空白。 TermView被插入到mainPage中,并且应该包含Term信息以及通过SelectableItemsView显示的Class列表。我也尝试过使用ListView及其给我同样的问题。

TermView.xaml.cs构造函数

public TermView(int termId)
        {
            InitializeComponent();
            this.Term = new Term(termId);
            this.BindingContext = this.Term;
        }

TermView.xaml

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="TermManager1.TermView">

        <StackLayout VerticalOptions="Start" >
            <FlexLayout AlignItems="Center" Direction="Row" JustifyContent="SpaceBetween" VerticalOptions="Start">
                <DatePicker Date="{Binding TermStartDate}" />
                <Editor Text="{Binding TermName}" />
                <DatePicker Date="{Binding TermEndDate}" />
            </FlexLayout>
            <SelectableItemsView x:Name="ClassesCollectionView" ItemsSource="{Binding classes}" >
                <SelectableItemsView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout>
                                <Label Text="{Binding ClassName}"/>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </SelectableItemsView.ItemTemplate>
            </SelectableItemsView>
            <FlexLayout>
                <Button Text="Add Class" Clicked="AddClassButton_OnClicked" />
                <Button Text="Delete Class" Clicked="DeleteClassButton_OnClicked" />
            </FlexLayout>
        </StackLayout>

</ContentView>

术语类构造器和类列表

 public List<Class> classes = new List<Class>();

        public Term(int termID)
        {
            this.TermId = termID;
            this.TermName = String.Concat("TermName", termID);
            this.classes.Add(new Class());
            this.classes.Add(new Class());
            this.classes.Add(new Class());
            this.classes.Add(new Class());

        }

类的类构造器

 public Class()
        {
            this.ClassName = "ClassName";
            this.ClassId = 0;
            this.ClassStatus = "Unset Status";
        }

3 个答案:

答案 0 :(得分:0)

您可能只需要使用INPC即可。

将类更改为ObservableCollection而不是List(请注意,还有一个ToObservableCollection扩展可用)。

然后对于Class对象,只需继承自BindableObject,然后在setter中使用OnPropertyChanged()获取要更新的属性,例如:

    private string _className;
    public string ClassName;
    {
        get => _className;
        set
        {
            _className = value;
            OnPropertyChanged();
        }
    }

答案 1 :(得分:0)

因此,我通过各种方法解决了我的问题。首先,我用CollectionView替换了SelectableItemsView。然后,我将类列表更改为ObservableCollection。最后,我用StackLayout替换了TermView xaml中的ViewCell。

答案 2 :(得分:-1)

  

我也尝试过使用ListView,它给了我同样的问题。

根据您的代码,我看到您在List类中添加了一些Class,但是您没有分配ClassName值,这是有关ListView的示例:

public partial class Page30 : ContentPage
{
    public Page30 (int Id)
    {
        InitializeComponent ();
        this.BindingContext = new Term(Id);
    }
}

public class Term
{
    public List<Class1> classes { get; set; }
    public int TermId { get; set; }
    public string TermName { get; set; }
    public DateTime TermStartDate { get; set; }
    public DateTime TermEndDate { get; set; }

    public Term(int TermId)
    {
        this.TermId = TermId;
        this.TermName = String.Concat("TermName", TermId);
        TermStartDate = new DateTime(2017,7,24);

        TermEndDate = new DateTime(2019,01,01);

        classes = new List<Class1>()
        {
            new Class1(){ClassName="class a"},
             new Class1(){ClassName="class b"},
              new Class1(){ClassName="class c"},
               new Class1(){ClassName="class d"},
                new Class1(){ClassName="class e"},
                 new Class1(){ClassName="class f"},
               new Class1(){ClassName="class g"},
        };          
    }
}

public class Class1
{
    public string ClassName { get; set; }
}