【问题标题】:Binding GridView to List<Object>将 GridView 绑定到 List<Object>
【发布时间】:2014-04-15 20:12:02
【问题描述】:

我一直在网上搜索(包括堆栈溢出)来解决这个问题。我目前遇到的问题是我将我的数据错误地绑定到我的视图。当用户第一次导航到主页时,GridView 什么也不显示。当我转到另一个页面然后返回主页时,将显示列表,但它填充了字符串“MyProject.Model.MyTask” p>

我知道问题不在于我的模型或视图模型,因为我能够正确检索包含内部数据的列表。一个问题可能与我在视图模型中的等待调用有关。关于将我的列表绑定到 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>

【问题讨论】:

  • MyTask 的属性命名有点冗余。对我来说,GridView 上也不存在 ItemsSource。你确定这是你的代码吗?
  • @Measuring OP 在 WinRT XAML 下。 WPF GridView 只是 ViewListView
  • @HighCore 啊,请原谅我。感谢您清理它。

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


【解决方案1】:

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

其次,您实际上所做的是将源设置到您的列表中,然后尝试添加 TextBlock 也作为源(并被忽略)。您正在寻找的是设置ItemTemplate。比如:

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

更多信息请参见the documentation

【讨论】:

  • 您能否详细说明第一段,特别是在 gridview 绑定后填充列表?在 gridview 与它绑定之前我将如何填充列表?
  • 你不能真正使用异步调用。要在绑定之前完成,可能必须在施工期间完成。任何其他时间充其量都是一个废话。如果您获取现有列表并稍后填充它,它不会告诉GridView 何时添加更多项目。如果您稍后将其设置为新列表,只要您实现INotifyPropertyChanged 就可以了。如果您使用ObservableCollection&lt;MyTask&gt;,它会很聪明地告诉GridView,它在您填充它时收到了新项目。
【解决方案2】:

你需要在MyTasks的setter中实现INotifyPropertyChanged并提升PropertyChanged

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

【讨论】:

  • 引用:“当用户第一次导航到主页时,GridView 什么也没有显示”——是的,这可能是相关的。我得出了相同的结论,并将其列在答案的第一部分。
【解决方案3】:

您缺少 XAML 的部分内容:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 2011-07-09
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2015-09-01
    相关资源
    最近更新 更多