none
Compilerfehler (DataTemplates und MVVM (Reflection)) RRS feed

  • Allgemeine Diskussion

  • Hallo miteinander,

    ich habe ein Problem mit dem ich einfach nicht weiter komme.

    In meiner Projektmappe habe ich, so wie es bei MVVM sein sollte, drei Projekte:

    1. Model, Klassenbibiothek
    2. ViewModel, Klassenbibliothek (referenziert Model)
    3. View, WPF-Anwendung (referenziert ViewModel

    Die Anwendung lässt sich kompilieren und ausführen. Die Datenbindung funktioniert.

    Im nächsten Schritt will ich DataTemplates/HierarchicalDataTemplates verwenden.

    Ergebnis: Die Anwendung lässt sich nicht mehr kompilieren :-(

    Fehlermeldung:
    Error MC1000\View\MainWindow.xaml(29,115): error MC1000: Unbekannter Buildfehler, "Die Abhängigkeit von Assembly "Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" kann nicht aufgelöst werden, da sie nicht vorher geladen wurde. Beim Verwenden der ReflectionOnly-APIs müssen abhängige Assemblys vorher geladen oder über das ReflectionOnlyAssemblyResolve-Ereignis bei Bedarf geladen werden. Zeile 29 Position 115."

    Hier der betroffene Code-Ausschnitt:

    <HierarchicalDataTemplate DataType="{x:Type viewModel:PersonVM}" ItemsSource="{Binding Adressen}">
      <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Nachname}"/>
        <TextBlock Text="{Binding Vorname, StringFormat={}\, {0}}"/>
        <TextBlock Text="{Binding Geburtsdatum, StringFormat={}\, *{0:dd.MM.yyyy}}"/>
      </StackPanel>
    </HierarchicalDataTemplate>

    Ich vermute, dass x:Type viewModel:PersonVM Reflection verwendet und meine Model-Assembly (die in diesem Fall von PersonVM verwendet wird) zum Compilezeitpunkt nicht geladen ist.

    Verhindern kann ich den Fehler, indem ich auch die Model-Assembly in der View-Assembly referenziere.
    Das haben wir im Projekt auch schon gemacht und dafür gleich die ersten Probleme durch "unerlaubte" Zugriffe aus der View auf das Model bekommen. Deswegen ist sowas ja auch nicht im Sinne von MVVM.

    Alternativ kommt wahrscheinlich der Lösungsvorschlag "ReflectionOnlyAssemblyResolve" in der Fehlermeldung in Betracht.
    Da habe ich aber keine Vorstellung wie ich das dem Compiler sage :-(

    Hat jemand eine Idee?

    Bei Bedarf kann ich mehr Code liefern.

    Vielen Dank
    Rolf




    Dienstag, 25. April 2017 15:13

Alle Antworten

  • Hallo Rolf,

    Die Ursache dieses Fehlers ist, dass jede abhängige DLL nicht an der richtigen Stelle gefunden werden kann. Weitere Informationen enthalten folgende Threads:
    How can i solve this error?
    Unknown build error while using WPF toolkit Datepicker control

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 28. April 2017 09:25
    Moderator
  • Hallo Ivan,

    vielen Dank für Deine Antwort.

    Links, wie die von Dir empfohlenen habe ich so einige gefunden.
    Die Ursache für die Probleme dort, ist aber immer das nicht vorhanden sein einer Assembly, die nicht zur Arbeitsmappe gehört (System.Windows, WpfToolkit, Infragistics, ...). Oft stellt sich auch heraus, das es sich nicht um WPF, sondern um Silverlight handelt. In fast allen Fällen ist die Ursache ein Versionskonflikt oder einfach die fehlende Registrierung im GAC.

    In meinem Fall hat der Compiler aber Probleme mit einer Assembly, die zur Arbeitsmappe gehört und immer im Ausführungsverzeichnis liegt und Teil des Abhängigkeitsbaumes ist.
    Das Problem tritt auch erst dann auf, wenn ich im XAML (Hierachical)DataTemplates und die TypeExtension (x:Type) verwende. kommentiere ich diese Abschnitte aus, lässt sich alles kompilieren und ausführen.

    Ich vermute, dass das mit dem "ReflectionOnlyAssemblyResolving" zusammenhängt.
    Ich habe mir eine Klasse mit eigener Main-Methode und statischem ReflectionOnlyAssemblyResolve-Handler geschrieben und sie als Startobjekt verwendet. Im Handler habe ich die fehlende Assembly mit ReflectionOnlyLoad(AssemblyName) und ReflectionOnlyLoadFrom(Buildpath und Dateiname der Assembly) zurückgegeben. Aber auch das hat mich nicht weitergebracht.

    Mir gehen die Ideen aus :-(

    Gruß Rolf

    Freitag, 28. April 2017 11:09
  • Hallo Rolf,
    ohne das ich große Erfahrung mit WPF habe.
    Was macht denn die Bindung?
    DataType="{x:Type viewModel:PersonVM}"

    sollte das etwa so heißen??
    DataType="{x:Type models:PersonVM}"
    die andere Schreibweise wäre
    DataType="{x:Type local:PersonVM}"
    HTH
    Grüße Alexander

    Freitag, 28. April 2017 15:20
  • Hallo Alexander,

    die Property DataType gehört zum DataTemplate, bzw. HierarchicleDataTemplate und sagt aus, für welchen Typen dieses Template angewendet werden soll. "{x:Type viewModel:PersonVM}" ist schon richtig, weil PersonVM im Namespace ViewModel ist. Dieser Namespace ist im Window-Tag mit dem Namen "viewModel" angegeben.

    Das Problem ist auch nicht PersonVM, sondern der Typparameter PersonVM<Person> der aus der Assembly Model stammt und vom Xaml-Compiler nicht aufgelöst werden kann.

    Hat leider nicht geholfen

    Viele Grüße
    Rolf

    Freitag, 28. April 2017 18:46