2017-03-08 93 views
1

我有一個WPF項目,盡我所能使用MVVM模式。我使用Visual Studio 2010,而後面的語言是C#。WPF BitmapImage not display

所以我有一個treeview。樹形視圖看起來是這樣的:

<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方面是否工作。我相當確定它是,因爲在圖像旁邊有一個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 =新的BitmapImage(outUri)」,你可以看到相關信息在這裏:picture。從這幅圖看來,圖像已成功加載。

我確定我錯過了一些明顯的東西,但如果我能說出它是什麼,我會很尷尬。從我對WPF和XAML的有限經驗來看,除了缺少圖像外,它似乎工作正常。

那麼,如果你能提供任何幫助,將不勝感激。

編輯:一些澄清。 Treeview的DataContext稱爲ScenesViewModel。它包含一個SceneViewModel列表,該列表被稱爲「場景」。每個SceneViewModel都包含一個CharacterViewModel列表,稱爲'Characters'。 These two images顯示這些類的相關部分,所以希望層次結構可以被理解。對於每個CharacterViewModel,應該有一個ImgIcon。

+1

自從Image在代碼中加載後,我會用'ImgIcon'屬性仔細檢查你的上下文實際上是你的對象,而不是你的'Character'對象,它具有與FirstName完全相同的屬性名稱。 – TyCobb

回答

1

確保您綁定到視圖模型(ScenesViewModel)財產,如果ImgIcon屬性在這個類中定義:

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

StackPanelItemTemplateDataContextItemsSource,而不是一個項目視圖模型。

編輯:您應該爲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> 
+0

爲了澄清,DataContext被稱爲「ScenesViewModel」。這包含一個名爲「場景」的SceneViewModel列表。每個SceneViewModel都包含一個名爲'Characters'的CharacterViewModel列表。它在ImgIcon的CharacterViewModel中。 – TheFaithfulLearner

+0

ImgIcon定義在哪個類中? – mm8

+0

CharacterViewModel。我編輯了我的原始問題,嘗試清除層次結構。 – TheFaithfulLearner

0

此答案適用於那些希望瞭解發生了什麼事情的人 - 也許您有同樣的問題。

我的問題實際上是在我的代碼中的其他地方。當我從我的數據庫加載Scene(數據模型)以填充SceneViewModel的數據時,我創建了一個用於加載圖像的實例,然後將新實例添加到列表中。所以有兩個實例,一個是創建的,用於加載圖像然後不使用,另一個是使用的(但沒有加載圖像)。基本上這是一個簡單的錯誤,與這裏看到的代碼無關 - 所有的工作都很好(因爲現在我糾正了錯誤,事情就像他們應該的那樣工作,圖像和所有東西)。

感謝所有花時間回答的人。