WPF BitmapImage未显示

时间:2017-03-08 20:26:57

标签: c# wpf xaml mvvm

我有一个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>

争用的焦点是Image,其来源被称为'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)'中设置了一个断点,您可以在此处查看相关信息:picture。从这张图片看来,图像已成功加载。

我确定我错过了一些明显的东西,但如果我能说出它是什么,我该死的。根据我对WPF和XAML的有限经验,它似乎工作正常,除了缺少图像。

好吧,如果你能提供任何值得赞赏的帮助。

修改:一些澄清。 Treeview的DataContext称为ScenesViewModel。它包含一个SceneViewModel列表,该列表称为“场景”。每个SceneViewModel都包含一个CharacterViewModel列表,称为“Characters”。 These two images显示这些类的相关部分,因此希望可以理解层次结构。对于每个CharacterViewModel,应该有一个ImgIcon。

2 个答案:

答案 0 :(得分:1)

如果在此类中定义了ScenesViewModel属性,请确保绑定到视图模型(ImgIcon)属性:

<Image Source="{Binding DataContext.ImgIcon, RelativeSource={RelativeSource AncestorType=TreeView}}" Margin="2"/>

DataContextStackPanel的{​​{1}}是ItemTemplate中的项目,而不是视图模型。

编辑:您应该为SceneViewModel对象定义一个模板,为CharacterViewModel对象定义另一个模板。您可以将隐式模板放在TreeView的部分中:

ItemsSource

答案 1 :(得分:0)

这个答案适合那些希望看到发生了什么的人 - 也许你有同样的问题。

我的问题实际上是我的代码中的其他地方。当我从我的数据库加载一个Scene(数据模型)来填充SceneViewModel的数据时,我创建了一个用于加载图像的实例,然后在列表中添加了一个新实例。因此,有两个实例,一个是创建的,用于加载图像然后不使用,另一个使用(但没有加载图像)。基本上这是一个简单的错误,与这里看到的代码没有关系 - 一切正常(从现在我纠正了错误,事情就像它们应该工作,图像和所有)。

感谢所有花时间回答的人。