在很多情况下,我已经使用gridviews和listview做了一千次,但这次由于一些未知的原因,它似乎无法正常工作。
我只是在 UWP 应用中创建一个简单的 ListView ,然后将 ItemSource 与 x:Bind 到 ObservableCollection<文件夹>来源,其中文件夹只是一个类。我已经检查了一个断点,即使在实例化 ViewModel 之后,listview的 ItemSource 也是null。但是如果我在后面的代码中设置ItemSource而不是绑定它,那么它的工作正常。我使用的是基本的 MVVM pattren。
CODE
LibraryPage.xaml
<ListView ItemsSource="{x:Bind ViewModel.Source}" x:Name="AdaptiveView">
<ListView.ItemTemplate>
<DataTemplate x:DataType="data:VideoFolder">
<controls:DropShadowPanel>
<Grid Height="200" Width="200">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Image Source="{x:Bind Thumbnail,Mode=OneWay}"/>
<TextBlock Text="{x:Bind Title}" Grid.Row="1"
VerticalAlignment="Center" />
</Grid>
</controls:DropShadowPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
LibraryPage.xaml.cs
public sealed partial class LibraryPage : Page
{
public LibraryViewModel ViewModel { get; set; }
public LibraryPage()
{
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
ViewModel = new LibraryViewModel(KnownFolders.VideosLibrary);
var source = AdaptiveView.ItemsSource;
}
}
LibraryViewModel.cs
public class LibraryViewModel : Observable
{
public ObservableCollection<VideoFolder> Source { get; set; }
public StorageFolder MainFolder { get; set; }
public LibraryViewModel(StorageFolder mainFolder)
{
Source = new ObservableCollection<VideoFolder>();
for (int i = 0; i < 10; i++)
{
Source.Add(new Folder { Title = "touseef" + i });
}
// MainFolder = mainFolder;
//FillUpFolders();
//FillUpFiles();
}
}
我在这里提供我的应用程序项目,以便如果有人想运行它并在自己的机器上测试它,问题只在LibraryPage上,所以你可以运行应用程序并导航到库并且看到我的列表视图中没有任何项目。项目是使用 Windows Template Studio 创建的,应用程序中的一些元素来自nuget包 UWP社区工具包。
请看一下,让我知道为什么我的ListView中没有任何项目。这是该项目的链接。
https://github.com/touseefbsb/ListViewItemSourceBug
min target 创建者更新
目标秋季创作者更新
我的设备内部人员构建17120
答案 0 :(得分:1)
我认为问题在于如何在该页面上初始化视图模型。加载ListView后,视图模型将被初始化,因此绑定会在此阶段看到source
为空。我通常做的是:
在页面XAML中,像这样初始化ViewModel:
<Page.DataContext>
<LibraryViewModel />
</Page.DataContext>
上面的代码将确保您的视图模型与页面的其余部分一起初始化。然后在该页面的c#Code Behind中执行以下操作:
public LibraryViewModel ViewModel => (LibraryViewModel)this.DataContext;
现在加载页面时,View模型已经加载了。
接下来,在列表视图的XAML绑定中,将模式设置为OneWay(在这种情况下,我认为这是可选的,因为您的Source
在View Model构造函数中初始化,但我在这里添加只是为了确定):
<ListView ItemsSource={x:Bind ViewModel.Source, Mode=OneWay} .... />