【问题标题】:ListView Databinding with custom views具有自定义视图的 ListView 数据绑定
【发布时间】:2016-11-26 04:24:22
【问题描述】:

我正在尝试在 xamarin 项目中使用数据绑定显示自定义视图的自定义列表(我最终将向每个视图添加控件)。但是,当我运行我的项目时,列表上没有显示任何内容。我对数据绑定的东西有点陌生,所以我有点困惑。我已经搜索并尝试了其他一些解决方案,但无法弄清楚我的具体问题。任何帮助,将不胜感激。这是我的代码:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XamarinTuts.XMainPage">

  <ContentPage.Content>
    <StackLayout>
      <Label Text="Tasks:" HorizontalTextAlignment="Start" VerticalTextAlignment="Start" x:Name="tasksLabel"></Label>
      <ListView ItemsSource="{Binding taskItems}">
        <ListView.ItemTemplate>
          <DataTemplate>
            <Frame BackgroundColor="Black" Padding="5">
              <Grid>
                <StackLayout Name="TextStack" Orientation="Vertical" Grid.Column="0">
                  <Label Text="{Binding Name}"></Label>
                  <Label Text="{Binding Description}"></Label>
                </StackLayout>
                <StackLayout Name="ButtonStack" Orientation="Horizontal" HorizontalOptions="End" Grid.Column="1">
                  <Button Name="Edit" Text="Edit" Width="50" Height="50"></Button>
                </StackLayout>
              </Grid>
            </Frame>
          </DataTemplate>
        </ListView.ItemTemplate>
      </ListView>

    </StackLayout>

  </ContentPage.Content>  

</ContentPage>

那是我的 XAML。这是我的 XMainPage.cs:

public partial class XMainPage : ContentPage
{


    TestViewModel vm;

    public XMainPage()
    {

        InitializeComponent();

        vm = new TestViewModel();

        TaskListItem testItem = new TaskListItem(this, "Go shopping", "Drive to meijer and get the following: Milk, Eggs, Booze");
        TaskListItem testItem2 = new TaskListItem(this, "Play Overwatch", "Pwn some n00bs");
        vm.taskItems.Add(testItem);
        vm.taskItems.Add(testItem2);


        BindingContext = vm;
    }

}

接着是我的 TestViewModel.cs:

public class TestViewModel : INotifyPropertyChanged
{

    ObservableCollection<TaskListItem> mtaskItems;

    public TestViewModel()
    {
        mtaskItems = new ObservableCollection<TaskListItem>();
    }


    public ObservableCollection<TaskListItem> taskItems
    {
        get
        {
            return mtaskItems;
        }
        set
        {
            mtaskItems = value;
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged(string name = null)
    {

        var changed = PropertyChanged;

        if (changed == null)
            return;

        changed.Invoke(this, new PropertyChangedEventArgs(name));

    }
}

接着是我的 TaskListItem.cs:

public class TaskListItem : ViewCell
{

    public Task newTask;

    String mName;
    String mDescription;

    public String Name
    {
        get
        {
            return mName;
        }
    }

    public String Description
    {
        get
        {
            return mDescription;
        }
    }


    public TaskListItem(ContentPage taskListItemParent, String TaskName, String TaskDescription)
    {
        //newTask = new Task(TaskName, TaskDescription);

        mName = TaskName;
        mDescription = TaskDescription;

    }
}

【问题讨论】:

    标签: c# xaml listview xamarin data-binding


    【解决方案1】:

    您尚未在视图上设置 BindingContext 属性。您应该创建一个 ViewModel 并将 Observable Collection 作为公共属性。

        TestViewModel vm;
    
        public XMainPage()
        {
            InitializeComponent();
    
            vm = new TestViewModel();
    
            BindingContext = vm;
        }
    

    使用 Xamarin.Forms 时,建议遵循 MVVM 模式。 Here is a simple sample 项目写道,您可以帮助您了解更好的数据绑定以及所有部分如何连接在一起。还有,在this chapter of the Xamarin.Forms bookDataBinding 里面解释的很好

    【讨论】:

    • 我已经用你的建议更新了我的代码,但它仍然不适合我。看起来我已正确设置,但页面上没有显示任何内容。我还缺少什么吗?
    • 原来我有一些无效的 XAML。在摆弄了一下之后,我能够让它正确显示。感谢您的帮助!
    • 在编译时找不到这些错误,这很糟糕。我很高兴这些信息对您有所帮助
    猜你喜欢
    • 2019-06-14
    • 2016-04-20
    • 2016-06-05
    • 2013-01-06
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多