xamarin绑定到列表

时间:2017-03-12 05:48:35

标签: c# .net xamarin xamarin.forms

我是Xamarin和C#的新手,如果我的代码是废话,请原谅我。

所以基本上我正在尝试创建一个显示课程名称列表的简单页面,并允许按钮在视图中插入或删除列表中的项目。

截至目前,程序已构建并运行,但视图不显示列表的内容。任何帮助将不胜感激。谢谢!

以下是观点:

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="65" />
            <RowDefinition Height="*"/>
            <RowDefinition Height="50" />
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Frame OutlineColor="Black" Grid.Row="0" Grid.ColumnSpan="2">
            <Label Text= "My Courses" FontSize="20" TextColor="Black" HorizontalTextAlignment="Center"/>
        </Frame>

        <Frame OutlineColor="Black" Grid.Row="1" Grid.ColumnSpan="2">

        <ListView x:Name="CourseList" ItemsSource="{Binding GetCourseList}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>

                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="50" />
                            </Grid.ColumnDefinitions>

                            <Label FontSize="14" Text="{Binding Name}" TextColor="Black" Grid.Row="0" Grid.Column="0"/>

                            <Button FontSize="14" Text="X" TextColor="Black" Grid.Row="0" Grid.Column="1"/>
                        </Grid>

                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        </Frame>

        <Button Text="+" FontSize="20" TextColor="Green" BackgroundColor="Silver"
                HorizontalOptions="Fill" VerticalOptions="Center"
               Grid.Row="2" Grid.ColumnSpan="2"
                />
    </Grid>

这是View.cs代码:

public partial class MainPage : ContentPage
{
    MainPageViewModel vm;                               

    public MainPage()
    {
        vm = new MainPageViewModel();                  

        vm.AddCourse();

        BindingContext = vm;

        InitializeComponent();
    }

这是视图模型:

class MainPageViewModel
{
    public string Name { get; set; }
    public List<Course> Courses;


    public MainPageViewModel()
    {
        Courses = new List<Course>();
    }


    public List<Course> GetCourseList()
    {
        return Courses;
    }

    public void AddCourse()
    {
        Course NewCourse = new Course();
        NewCourse.Name = "New Course Added";

        Courses.Add(NewCourse);
    }

}

最后,这是我的模特:

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

}

所以我能够使用这段代码显示一个列表,但我不相信这会允许我在列表中添加或删除并通过按钮点击更新视图(如果我错了,请纠正我)。

public List<Course> Courses{
    get{
       return new List<Course>(){
           new Course(){Name = "Added a course"}
          };
       } 

2 个答案:

答案 0 :(得分:0)

我想我刚刚发现了我的错误和解决方案。

    public List<Course> Courses{
get{
   return new List<Course>(){
       new Course(){Name = "Added a course"}
      };
   } 

因为课程是“只读”并且现在被绑定到视图我创建了一个成员变量List VMCourse来保存实际的对象列表并使用Courses来限制并读入视图。

它似乎工作,但我仍然需要使用按钮功能进行测试,以便从列表中添加和删除。这看起来对你们来说是一个不错的解决方案吗?

提前致谢!

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

    public List<Course> VMCourse;


    //This is now bound to the view's listview
    public List<Course> Courses {
        get
        {
            return VMCourse;
        }
    }


    public MainPageViewModel()
    {
        VMCourse = new List<Course>();
    }

    public void AddCourse()
    {
        Course NewCourse = new Course();
        NewCourse.Name = "New Course Added";

        VMCourse.Add(NewCourse);
    }

答案 1 :(得分:0)

您无法将列表绑定到方法。您应该使用绑定属性。所以要解决这个问题,你只需要改变

public List<Course> GetCourseList()
{
    return Courses;
}

public List<Course> GetCourseList
{
    get { return Courses; }
}

但是,正如在评论中提到的那样,任何属性都不适合与绑定一起使用,除非你知道你在做什么,所以搜索绑定。