我一直在浏览网页(包括堆栈溢出)以解决此问题。我遇到的当前问题是我将我的数据绑定到我的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>
答案 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>