将GridView绑定到List <object> </object>

时间:2014-04-15 20:12:03

标签: c# gridview windows-store-apps winrt-xaml mvvm-light

我一直在浏览网页(包括堆栈溢出)以解决此问题。我遇到的当前问题是我将我的数据绑定到我的View。当用户首次导航到主页时,GridView不显示任何内容。当我转到另一个页面然后返回主页时,会显示该列表,除了它填充的字符串表示“ MyProject.Model.MyTask

我知道问题不在于我的模型或视图模型,因为我能够使用里面的数据正确检索列表。一个问题可能是我在我的viewmodel中的await调用。有关将我的List绑定到GridView时我做错了什么的想法吗?

视图模型

  public HomeViewModel(IDataService dataService, INavigationService navigationService)          _dataService = dataService;
     _navigationService = navigationService;
     Initialize();
  }      

  private async Task Initialize() {
     MyTasks = await ApiHandlker.GetMyTasks();
  }

  private List<MyTask> _myTasks;
  public List<MyTask> MyTasks {
     get { return _myTasks; }
     set { _myTasks = value; }
  }

模型

public class MyTask {
    public string TaskID { get; set; }
    public string TaskName { get; set; }
    public string TaskAssigneeID { get; set; }
    //...
}

查看

<GridView x:Name="gridViewMyTasks" ItemsSource="{Binding MyTasks}">
   <TextBlock Text="{Binding TaskName}"></TextBlock>
</GridView>

3 个答案:

答案 0 :(得分:4)

不要将其绑定到列表,而是绑定到ObservableCollection<MyTask>。您在GridView绑定到列表后填充列表,因此GridView不知道它已更改。如果您没有填充它而只是设置它,则需要实现INotifyPropertyChanged

其次,您实际上在做的是将源设置到列表中,然后尝试添加TextBlock作为源(并被忽略)。你要找的是设置ItemTemplate。类似的东西:

<GridView.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding TaskName}"/>
    </DataTemplate>
</GridView.ItemTemplate>

有关详细信息,请参阅the documentation

答案 1 :(得分:1)

您需要在INotifyPropertyChanged的设置器中实施PropertyChanged并提升MyTasks

您可能会发现我最近的MSDN article on asynchronous data binding有帮助。

答案 2 :(得分:1)

您缺少XAML的部分内容:

<GridView x:Name="gridViewMyTasks" ItemsSource="{Binding MyTasks}">
   <GridView.ItemTemplate>
       <DataTemplate>
           <TextBlock Text="{Binding TaskName}"/>
       <DataTemplate>
   <GridView.ItemTemplate>
</GridView>