2017-03-08 4 views
1

Ich habe ein WPF-Projekt, das, so gut ich kann, das MVVM-Muster verwendet. Ich verwende Visual Studio 2010, und die Sprache dahinter ist C#.WPF BitmapImage wird nicht angezeigt

So habe ich eine Baumansicht. Die treeview sieht wie folgt aus:

<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> 

Der Streitpunkt ist das Bild, die Quelle, von denen etwas ‚ImgIcon‘ genannt gebunden ist. Dies ist eine Eigenschaft eines Ansichtsmodells namens "CharacterViewModel". Aus irgendeinem Grund bekomme ich nichts angezeigt wo das Bild sein sollte.

Das offensichtlichste Problem könnte in Bezug auf den Datenkontext sein oder ob die MVVM-Seite der Dinge funktioniert. Ich bin mir ziemlich sicher, dass es einen TextBlock neben dem Image gibt, der auch an eine Eigenschaft mit dem Namen 'FirstName' gebunden ist. Diese Bindung funktioniert gut.

Die beiden Eigenschaften sind natürlich in der View-Modell, und kann hier gesehen werden:

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"); 
     } 
    } 

Sie sind, dass etwas anders letztere wickeln nicht in der Zeichenklasse um eine Immobilie.

Also der nächste mögliche Fehler wäre das Laden des Bildes. Dies wird durch dieses Verfahren erreicht (die im Moment nur einen Prüfpfad für eine bekannte Arbeitsdatei hat):

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; 
    } 

ich einen Haltepunkt setzen in auf ‚ImgIcon = new Bitmap (outUri)‘ und Sie können sehen, die relevanten Informationen hier: picture. Es scheint von diesem Bild aus, dass das Bild erfolgreich geladen wurde.

Ich bin sicher, ich vermisse etwas offensichtlich, aber ich bin verdammt, wenn ich sagen kann, was es ist. Von meiner begrenzten Erfahrung mit WPF und XAML scheint es zu funktionieren, außer dem Mangel an einem Bild.

Nun, wenn Sie jede Hilfe anbieten können, die sehr geschätzt wäre.

Bearbeiten: ein paar Klarstellungen. Der DataContext für die Baumansicht heißt ScenesViewModel. Dies enthält eine Liste von SceneViewModel, und diese Liste heißt "Szenen". Jedes SceneViewModel enthält eine Liste von CharacterViewModel mit dem Namen "Characters". These two images zeigen den relevanten Teil dieser Klassen, so dass hoffentlich die Hierarchie verstanden werden kann. Für jedes CharacterViewModel sollte ein ImgIcon vorhanden sein.

+1

Von einem kurzen Blick, da das Bild in Code geladen wird, würde ich überprüfen, Ihr Kontext ist eigentlich Ihr Objekt mit der 'ImgIcon' -Eigenschaft und nicht Ihr' Character' Objekt, das genau den gleichen Namen für FirstName hat. – TyCobb

Antwort

1

Vergewissern Sie sich, dass Sie die Ansicht Modell binden (ScenesViewModel) Eigenschaft, wenn die ImgIcon Eigenschaft in dieser Klasse definiert:

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

Die DataContext der StackPanel im ItemTemplate ist ein Element in den ItemsSource und nicht das Ansichtsmodell.

Bearbeiten: Sie sollten eine Vorlage für SceneViewModel-Objekte und eine andere für CharacterViewModel-Objekte definieren. Sie könnten die impliziten Vorlagen in dem Abschnitt des TreeView setzen:

<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

Zur Klarstellung, der DataContext heißt 'ScenesViewModel'. Dies enthält eine Liste von SceneViewModel namens "Szenen". Jedes SceneViewModel enthält eine Liste von CharacterViewModel namens "Characters". Es ist in CharacterViewModel, dass ImgIcon ist. – TheFaithfulLearner

+0

In welcher Klasse ist der ImgIcon definiert? – mm8

+0

ZeichenViewModel. Ich habe meine ursprüngliche Frage bearbeitet, um zu versuchen, die Hierarchie zu klären. – TheFaithfulLearner

0

Diese Antwort für alle, die schauen, um zu sehen, was passiert ist - vielleicht haben Sie das gleiche Problem haben.

Mein Problem war eigentlich woanders in meinem Code. Als ich eine Szene (Datenmodell) aus meiner Datenbank geladen habe, um die Daten des SceneViewModels zu füllen, habe ich eine Instanz erstellt, mit der ich das Bild geladen habe, und dann eine neue Instanz zur Liste hinzugefügt. Es gab also zwei Instanzen, eine, die erstellt wurde, zum Laden der Bilder verwendet wurde und dann nicht verwendet wurde, und eine andere, die verwendet wurde (aber die Bilder wurden nicht geladen). Im Grunde war es ein einfacher Fehler und nicht mit dem Code, der hier zu sehen ist - dass alles gut funktioniert hat (seit ich den Fehler korrigiert habe, funktionieren die Dinge wie sie sollten, Bilder und alle).

Vielen Dank an alle, die sich die Zeit genommen haben zu antworten.

Verwandte Themen