当前位置: 首页 > 编程语言 > C#

使用数据绑定在WPF MVVM中以ListView(或更好的东西!)显示图像分享

时间:2023-04-11 01:00:58 C#

C#LearningTutorial:DisplayingImagesinaListView(orsomethingbetter!)inWPFMVVMUsingDataBinding在ListView中显示一些图像,但没有成功。我正在使用WPFMVVM,而ListView是一个延续,它只显示集合和排名数据。(请参阅我之前的帖子:WPF中的MVVM-如何提醒ViewModel模型中的更改......或者我应该吗?如果你感兴趣的话!)也就是说,我可以使用ListView以外的其他东西(如果这是建议的话)但是我仍然想知道如何使用ListView,假设它是可行的。我在ViewModel中绑定的属性是:publicObservableCollectionPlayerCardImages{get{ObservableCollectionresults=newObservableCollection();foreach(PlayerCards中的CardModel卡){Imageimg=newImage();BitmapImagebi3=newBitmapImage();bi3。开始初始化();//TODO:根据花色/等级挑选卡片。现在只需获取1张图像即可bi3.UriSource=newUri("diamond-1.png",UriKind.Relative);bi3.EndInit();图像。拉伸=拉伸.填充;img.Source=bi3;结果。添加(img);}返回结果;在我使用的XAML代码中:这个想法被无耻地窃取了:WPF-Bindimagehorizo??ntallytoTheListView然而,甚至没有出现数据绑定,因为我在PlayerCardImages中的断点没有被击中。幸运的是,我还尝试了以下XAML:这段代码肯定会通过数据绑定——我的断点在程序开始时和项目添加到集合时被命中。但是没有图像显示。与其用更多不起作用的XAML来折磨你,也许我可以请别人指点我一些代码/示例/文档,这些代码/示例/文档展示了如何将图像列表绑定到ListView(或者如果你真的认为ListView是另一个控制)不当)。请注意,我的收藏是我绑定的。我注意到在很多示例中,它们都绑定到子属性。即他们可能有一系列相册,每个相册都将绑定到它的属性图像(请参阅:在WPFListView中将项目显示为图像)。任何想法或帮助将不胜感激。附加信息。按照Clemens的建议,我现在有了PlayerCardImages的代码://if(PlayerCards.Count==0)//返回结果;//else//{//results.Add(newBitmapImage(newUri(@"Images\"+"diamond-1.png",UriKind.Relative)));//}foreach(varcardinPlayerCards){results.Add(newBitmapImage(newUri(@"Images\"+GetCardFileName(card),UriKind.Relative)));}返回结果;我使用了他建议的确切XAML。它几乎可以工作。我说“几乎”是因为我注意到奇怪的行为,有时会出现一张卡片,有时不会出现(我从来没有2张卡片)。从文件和绑定中获取的所有卡片似乎都在工作,我找到了我认为是最后一个剩余错误的关键(它很奇怪)。如果在调试器中检查结果,并在调试器中进一步打开result[0],就会显示卡片!我实际上必须打开[0](您会看到有关高度、宽度等的信息)才能使用。另外,如果我打开[1],我会出示卡片。为什么打开调试器信息有任何效果?对于那些可能会问的人,如果您在调试器中打开这两张卡会发生什么……那是行不通的。我收到操作超时异常。我会说也许我的图像文件很大。10Kbytes到30Kbytes。这是问题吗?我猜不是,这是阅读图像或绑定时的一个微妙问题。到底是怎么回事?谢谢,Dave首先,您不应该在ViewModel中使用Image控件。您已经在视图的DateTemplate中拥有Image控件。您要绑定此Image控件的Source属性,并且此绑定的source属性不能是另一个Image。相反,您的ViewModel将使用ImageSource(或像BitmapImage这样的派生类)作为图像类型,如下所示:foreach(PlayerCards中的varcard){results.Add(newBitmapImage(newUri(card.ImageUrl)));}返回结果;}}或者只是图像URI或路径,因为从字符串到ImageSource的转换是自动内置到WPF中的:publicObservableCollectionPlayerCardImages{get{foreach(PlayerCards中的varcard){results.Add(card.ImageUrl);}返回结果;您现在将列表框的ItemsSource属性绑定到PlayerCardGames集合,并在DataTemplate中直接绑定到集合项。ListView的DataContext必须设置为定义PlayerCardGames属性的对象的实例。更新:由于加载图像文件似乎有问题,您可以尝试以下操作。它同步加载图像,您可以使用调试器。publicstaticImageSourceLoadImage(stringfileName){varimage=newBitmapImage();使用(varstream=newFileStream(fileName,FileMode.Open)){image.BeginInit();image.CacheOption=BitmapCacheOption.OnLoad;image.StreamSource=流;image.EndInit();}返回图像;您可以在您的PlayerCardGames属性getter中使用此方法,如下所示:我并没有真正尝试重现你的问题,但如果那不能解决问题,我会这样做:在你的第一个xaml块中,我认为你混淆了绑定。这就是我所期望的,ItemsSource到图像的ObservableCollection,图像源到图像。在第二块中,您完全省略了Source绑定:以上是C#学习教程:在WPFMVVM中使用数据绑定在ListView中显示图像(或更好的东西!)正在使用,需要详细了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: