![](/img/trans.png)
[英]Binding a gridview's itemSource to the ViewModel with INotifyPropertyChanged
[英]Issue binding Gridview itemsource to viewmodel property
我在将视图模型中的collection属性绑定到GridView时遇到一些问题。 我正在使用MVVM light,我相信我已经正确设置了ViewModelLocator,并且在页面的xaml中设置了DataContext。
模型
public class Base
{
public ObservableCollection<Downloads> results { get; set; }
}
public class Downloads
{
public int id { get; set; }
public string name { get; set; }
public int trackNumber { get; set; }
public string mixName { get; set; }
public string title { get; set; }
public string slug { get; set; }
public string releaseDate { get; set; }
public string publishDate { get; set; }
public List<Artist> artists { get; set; }
public string artistNames
{
get
{
return (artists == null)
? string.Empty
: string.Join(", ", artists.Select(a => a.name));
}
}
public string artistNamesSlug
{
get
{
return (artists == null)
? string.Empty
: string.Join("_", artists.Select(a => a.name));
}
}
public Release release { get; set; }
public Label label { get; set; }
public Image images { get; set; }
public int downloadId { get; set; }
public string audioFormat { get; set; }
public string downloadUrl { get; set; }
}
public class Release
{
public int id { get; set; }
public string name { get; set; }
public string type { get; set; }
public string slug { get; set; }
}
public class Label
{
public int id { get; set; }
public string name { get; set; }
public string type { get; set; }
public string slug { get; set; }
public bool status { get; set; }
}
public class Image
{
public LargeImage large { get; set; }
}
public class LargeImage
{
public int id { get; set; }
public int width { get; set; }
public int height { get; set; }
public string url { get; set; }
public string secureUrl { get; set; }
}
视图模型
public class AvailableViewModel : ViewModelBase
{
public AvailableViewModel()
{
}
private Base availableDownloads;
public Base AvailableDownloads
{
get
{
if(availableDownloads == null)
{
GetData();
}
return availableDownloads;
}
set
{
availableDownloads = value;
RaisePropertyChanged(() => AvailableDownloads);
}
}
private async void GetData()
{
OAuth oauth = new OAuth();
string httpMethod = "GET";
string parameters = "status=available";
string response = await oauth.GetData(OAuth.availDownloadsUrl, httpMethod, parameters);
Base availableDownloads = JsonConvert.DeserializeObject<Base>(response);
}
}
XAML
DataContext="{Binding Available, Source={StaticResource Locator}}">
<Page.Resources>
<DataTemplate x:Key="AvailableGridView">
<Grid Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<Image Source="{Binding AvailableDownloads.images.large.url}" Grid.Column="0" />
<StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="20,0,0,0">
<TextBlock Text="{Binding AvailableDownloads.title}" Style="{StaticResource BaseTextBlockStyle}" TextWrapping="Wrap"/>
<TextBlock Text="{Binding AvailableDownloads.release.name}" Style="{StaticResource BaseTextBlockStyle}"/>
<TextBlock Text="{Binding AvailableDownloads.artistNames}" Style="{StaticResource SubtitleTextBlockStyle}"/>
</StackPanel>
</Grid>
</DataTemplate>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<GridView ItemsSource="{Binding AvailableDownloads.results}" SelectionMode="Multiple" ItemTemplate="{StaticResource AvailableGridView}"/>
</Grid>
这可能是问题的一部分,但是当我在xaml中设置DataContext时,布局会显示“对象引用”错误。 我不知道为什么会这样,但是应用程序会编译并运行。 我是MVVM的新手,我似乎无法弄清楚为什么我的绑定在这里不起作用。
这可能是问题的一部分,但是当我在xaml中设置DataContext时,布局会显示“对象引用”错误。
这是“对象引用错误” NullReferenceException错误吗? 由于您的代码不全面,因此我可以在多个地方重现此问题,但我不知道是什么导致了您的问题。
首先,我在这里更改了XAML代码以进行测试,并在GridView
的DataTemplate
中使用了x:Bind:
...
DataContext="{Binding Available, Source={StaticResource Locator}}"
xmlns:model="using:[Namespace of your app].Model">
<Page.Resources>
<DataTemplate x:Key="AvailableGridView" x:DataType="model:Downloads">
<Grid Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<!--<Image Source="{x:Bind downloadUrl}" Grid.Column="0" />-->
<StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="20,0,0,0">
<TextBlock Text="{x:Bind title}" Style="{StaticResource BaseTextBlockStyle}" TextWrapping="Wrap" />
<TextBlock Text="{x:Bind release.name}" Style="{StaticResource BaseTextBlockStyle}" />
<TextBlock Text="{x:Bind artistNames}" Style="{StaticResource SubtitleTextBlockStyle}" />
</StackPanel>
</Grid>
</DataTemplate>
</Page.Resources>
<Grid>
<GridView ItemsSource="{Binding AvailableDownloads.results}" SelectionMode="Multiple" ItemTemplate="{StaticResource AvailableGridView}" />
</Grid>
我像这样更改了您的Base
类:
public class Base
{
public ObservableCollection<Downloads> results { get; set; }
public Base()
{
results = new ObservableCollection<Downloads>();
}
}
如果您在添加数据时未创建ObservableCollection<Downloads>
的新实例,则可能是一个可能的原因。
我这样更改了AvailableViewModel()
,添加到result
中的数据是伪造的,仅用于测试:
public AvailableViewModel()
{
availableDownloads = new Base();
availableDownloads.results.Add(new Downloads { title = "11111", artistNames = "222", release = new Release(0, "333", "", "") });
availableDownloads.results.Add(new Downloads { title = "11111" });
availableDownloads.results.Add(new Downloads { title = "11111" });
availableDownloads.results.Add(new Downloads { title = "11111" });
availableDownloads.results.Add(new Downloads { title = "11111" });
}
如您所见,我在这里创建了一个新的Base
类实例。
我注意到在您的xaml代码中,您使用了release.name
,为此,我认为您需要像下面这样修改Release
类:
public class Release
{
public Release()
{
}
public Release(int Id, string Name, string Type, string Slug)
{
this.id = Id;
this.name = Name;
this.type = Type;
this.slug = Slug;
}
public int id { get; set; }
public string name { get; set; }
public string type { get; set; }
public string slug { get; set; }
}
您可以这样创建Release
类的实例:
release = new Release(0, "333", "", "");
我在DataTemplate
评论了Image
控件,要完成此工作,您需要像Release
类一样修改LargeImage
和Image
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.