[英]WPF BitmapImage not displaying
我有一个 WPF 项目,它尽可能地使用 MVVM 模式。 我使用的是 Visual Studio 2010,背后的语言是 C#。
所以我有一个树视图。 树视图如下所示:
<TreeView Grid.Column="0" Width="Auto" Background="Aquamarine" ItemsSource="{Binding Scenes}" SelectedItemChanged="TreeView_SelectedItemChanged">
<TreeView.DataContext>
<viewModels:ScenesViewModel />
</TreeView.DataContext>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Characters}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding SceneName}"></TextBlock>
<Image Source="{StaticResource ImgWorld}" Margin="0,0,5,0" Width="32" Height="32"/>
</StackPanel>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}"></TextBlock>
<Border BorderThickness="1" Background="RoyalBlue">
<Image Source="{Binding ImgIcon}" Margin="2"/>
</Border>
</StackPanel>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
争论的焦点是图像,其来源绑定到称为“ImgIcon”的东西。 这是名为“CharacterViewModel”的视图模型的属性。 出于某种原因,我没有在图像应该显示的位置显示任何内容。
最明显的问题可能是关于数据上下文或 MVVM 方面是否正常工作。 我相当确定它是,因为 Image 旁边有一个 TextBlock,它也绑定到一个名为“FirstName”的属性。 这种绑定工作正常。
这两个属性当然在视图模型中,可以在这里看到:
public String FirstName
{
get { return Character.FirstName; }
set
{
if (Character.FirstName != value)
{
Character.FirstName = value;
RaisePropertyChanged("FirstName");
}
}
}
private BitmapImage _imgIcon = null;
public BitmapImage ImgIcon
{
get { return _imgIcon; }
set
{
_imgIcon = value;
RaisePropertyChanged("ImgIcon");
}
}
它们略有不同,后者不包含 Character 类中的属性。
所以下一个可能的错误是图像的加载。 这是通过这种方法完成的(目前它只有一个已知工作文件的测试路径):
public bool LoadIcon()
{
if (ImgIcon == null)
{
Uri outUri;
if (Uri.TryCreate(@"D:\Pictures\Icons\HCAria01.png", UriKind.Absolute, out outUri) )
{
}
ImgIcon = new BitmapImage(outUri);
return true;
}
else
return false;
}
我在 'ImgIcon = new BitmapImage(outUri)' 放了一个断点,你可以在这里看到相关信息:图片。 从这张图片看来,图片已经成功加载了。
我确定我遗漏了一些明显的东西,但我该死的,如果我能说出它是什么。 从我对 WPF 和 XAML 的有限经验来看,它似乎工作正常,除了缺少图像。
好吧,如果您能提供任何帮助,将不胜感激。
编辑:一些说明。 Treeview 的 DataContext 称为 ScenesViewModel。 这包含一个 SceneViewModel 列表,该列表称为“场景”。 每个 SceneViewModel 包含一个 CharacterViewModel 列表,称为“Characters”。 这两个图像显示了这些类的相关部分,因此希望可以理解层次结构。 对于每个 CharacterViewModel,都应该有一个 ImgIcon。
如果ImgIcon
属性在此类中定义,请确保绑定到视图模型 ( ScenesViewModel
) 属性:
<Image Source="{Binding DataContext.ImgIcon, RelativeSource={RelativeSource AncestorType=TreeView}}" Margin="2"/>
ItemTemplate
StackPanel
的DataContext
是ItemsSource
一个项目,而不是视图模型。
编辑:您应该为 SceneViewModel 对象定义一个模板,为 CharacterViewModel 对象定义另一个模板。 您可以将隐式模板放在 TreeView 的部分中:
<TreeView Grid.Column="0" Width="Auto" Background="Aquamarine" ItemsSource="{Binding Scenes}"
SelectedItemChanged="TreeView_SelectedItemChanged">
<TreeView.DataContext>
<viewModels:ScenesViewModel />
</TreeView.DataContext>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:SceneViewModel}" ItemsSource="{Binding Characters}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding SceneName}"></TextBlock>
<Image Source="{StaticResource ImgWorld}" Margin="0,0,5,0" Width="32" Height="32"/>
</StackPanel>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:CharacterViewModel}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}"></TextBlock>
<Border BorderThickness="1" Background="RoyalBlue">
<Image Source="{Binding ImgIcon}" Margin="2"/>
</Border>
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
这个答案是为那些想看看发生了什么的人准备的——也许你有同样的问题。
我的问题实际上在我的代码中的其他地方。 当我从数据库加载场景(数据模型)以填充 SceneViewModel 的数据时,我创建了一个用于加载图像的实例,然后向列表中添加了一个新实例。 所以有两个实例,一个被创建,用于加载图像,然后没有使用,另一个被使用(但没有加载图像)。 基本上,这是一个简单的错误,与此处看到的代码无关 - 一切正常(自从我纠正了错误以来,一切都按预期工作,图像等等)。
感谢所有花时间回答的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.