C# Prism 6 Anwendung / Unity

PEASANT KING

Commander
Registriert
Okt. 2008
Beiträge
2.397
Hallo Leute,

wie der Titel schon erahnen lässt bin ich dabei mir eine C# Anwendung unter Verwendung des Prism Frameworks und Unity zu programmieren
soweit so gut. Jetzt habe ich brav die Basis für die Anwendung geschaffen und habe mir ein Modul Projekt angelegt.

Kann auch in meiner Anwendung über Button mittels Prism Navigation und Region Manager die View des Moduls in der Hauptanwendung sichtbar machen.
Allerdings wenn ich in der View des Moduls meinen Testbutton betätige der mittels Databinding an das ViewModel des Moduls gebunden sein sollte,
passiert folgendes, das Binding versucht die Eigenschaft im ViewModel der Basis Anwendung zu suchen anstatt das ViewModel des Moduls heran zu ziehen.

Bevor hier gefragt wird,
Code:
ViewModelLocator.AutoWireViewModel="True"
habe ich in der View des Modules angeben.

Als Fehler bekomme ich immer beim Ausführen des Buttons
Code:
BindingExpression path error: 'PrintCommand' property not found on 'object' ''MainWindowViewModel'....
Wobei er hier ja das Model meines Moduls ansprechen sollte dort gibt es die Eigenschaft, wenn ich die Eigenschaft in dem MainWindowViewModel anlege würde es funktionieren
verständlich, allerdings würde das ja das Ganze Konzept von "Losely coupled modules" über den Haufen werfen...

Vielleicht hat ja Jemand eine Idee, ich bin frischer Anfänger was das Prism Framework angeht.
 
Hi, leider bietet deine Beschreibung keine eindeutigen Anhaltspunkte, um dir eventuell weiterhelfen zu können. Durchforste jedoch mal folgendes Beispielprojekt MVVM Code Sample using the Prism Library 5.0 for WPF. Der Aufbau könnte dich vielleicht auf die richtige Spur bringen...
 
Zuletzt bearbeitet: (Link)
Vielen Dank für die Antwort, aber die Tutorials und Manuals kenne ich alle zu Genüge.

Im Basisprojekt befindet sich die Bootstrapper Klasse eine View und ein ViewModel. Der Bootstrapper registriert custom regions und erstellt den Modulkatalog.
Das Modul wird auch geladen und wird auch in der jeweiligen Region angezeigt.
Lediglich wird der View aus dem Modul nicht das ViewModel aus dem Modul zugewiesen sondern das ViewModel des MainWindows, das ist mein einziges Problem.

Code:
using Prism.Commands;
using Prism.Mvvm;
using System.Windows;
using System;
using AccountingManager.Infrastructure;

namespace AccountingManager.Modules.Accounting.ViewModels
{
    public class AccountingWindowViewModel : ViewModelBase, IAccountingWindowViewModel
    {
        public DelegateCommand PrintCommand { get; private set; }

        public AccountingWindowViewModel(IAccountingView view) 
            : base(view)
        {
            PrintCommand = new DelegateCommand(PrintSome);
        }

        /// <summary>
        /// Test method
        /// </summary>
        private void PrintSome()
        {
            MessageBox.Show("Bla");
        }
    }    
}

Code:
<UserControl x:Class="AccountingManager.Modules.Accounting.Views.AccountingView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:AccountingManager.Modules.Accounting.Views"
             mc:Ignorable="d" 
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True"
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="28,71,0,0" VerticalAlignment="Top" Width="75" Command="{Binding PrintCommand}"/>
        <Button x:Name="button1" Content="Button" HorizontalAlignment="Left" Margin="142,71,0,0" VerticalAlignment="Top" Width="75"/>

    </Grid>
</UserControl>

Navigiert wird per Button im MainWindow mittels DelegateCommand der per Binding an die MainWindow und dem MainWindowViewModel.

Code:
        private void OpenAccounting()
        {
            this.Title = "Accounting Manager Pro - Konten";
            _regionManager.RequestNavigate("ContentRegion", new Uri("Accounting", UriKind.Relative));
            
        }
 
Also was mir auf den ersten Blick auffällt:
Dein ViewModel hat eine Abhängigkeit zur View (AccountingWindowViewModel Konstruktor).
Es sollte aber genau anders herum sein: Du musst deiner View im Konstruktor dein ViewModel übergeben und dem DataContext dein ViewModel zuweisen.
 
Zuletzt bearbeitet:
Ja das stimmt mein Model hat als Übergabeparameter die View, das war ein Test.
Eigentlich sollte ja durch den ViewModelLocator im Prismframework der View das Model automatisch zu geordnet werden.
Was hier leider nicht geschieht, meine View des Moduls bekommt stattdessen, das MainWindowModel zu geordnet durch Prism.

Ich steig aber nicht durch warum, denn eigentlich sollte das Model des Moduls zugeordnet werden.
 
Problem vor Wochen schon gelöst :)

Wen die Lösung interessiert, kann sie gerne dann mitteilen.

Nachtrag:

Die meisten Videos auf Youtube beziehen sich auf die veralteten Version von Prism als es noch in den Händen von MS war.
Die aktuelle Doku findet man unter github. Wenn man Videos zu Prism schauen möchte empfehle ich die Videos von Brian Lagunas zu suchen.
 
Zurück
Oben