.NET GUI

.NET Community rund um alle Graphical User Interface (GUI) Themen.
Willkommen bei .NET GUI. Anmeldung | Registrieren | Hilfe | Impressum | Forumsregeln
in Suchen

WPF Control mit Unity auflösen

Letzter Beitrag 10-17-2008 17:10 von Rainer Schuster. 4 Antworten.
Seite 1 von 1 (5 Treffer)
Beiträge sortieren: Zurück Weiter
  • 08-20-2008 10:35

    WPF Control mit Unity auflösen

    Hallo zusammen,

    ich habe mir eine Beispielapplikation gebaut. Sie besteht aus sehr rudimentären Shell, auf der ein gebautes LoginControl liegt. Ich habe im Startup von der Applikation alles was ich brauche im Container registriert. Und meine Shell "resolved". Mein LoginControl hat aber nicht die gewünschte Abhängigkeit injiziert bekommen.


    ApplicationEntryPoint:
    public class ApplicationStartup
    	{
    		[STAThread]
    		static void Main(string[ args)
    		{
    			IUnityContainer container = new UnityContainer ();
    			container.RegisterType<IRechteBenutzer, RechteBenutzer> ( new ContainerControlledLifetimeManager () );
    			container.RegisterType<IAdressSearch, AdressSearch> ( new ContainerControlledLifetimeManager () );
    			container.RegisterType<IVerbindungSearch, VerbindungSearch> ( new ContainerControlledLifetimeManager () );
    
    			container.RegisterInstance<IUnityContainer> ( container, new ContainerControlledLifetimeManager () );
    
    			Application app = new Application();
    			app.Run( container.Resolve<M2OfficeShell> () );
    		}
    	}

    Markup meiner Shell:
    <Window x:Class="M2Office.Win.UI.M2OfficeShell"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:M2Office.Win.UI"
        Title="Start" Height="488" Width="933">
        <Grid>
            <local:LoginControl x:Name="loginControl"
                                LoggedIn="LoginControl_LoggedIn"/>
        </Grid>
    </Window>

    Und hier Code-Behind von meinem LoginControl:

    public partial class LoginControl : UserControl, ILogin
    {
    	[Dependency]
    	public IRechteBenutzer RechteBenutzer { get; set; }

    Übersehe ich etwas?

    Mein Gedanken dazu waren, dass mein Controll erst zur Laufzeit über das Xaml in die Shell geladen werden und daher der UnityContainer beim Resolve die Abhängigkeiten nicht auflösen kann. Wer kennt einen geigneten Ansatz um die Abhängigkeit trotzdem richtig auzulösen?

    Gruß,
    Rainer
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 08-21-2008 17:40 Antwort zu

    • Jacobs
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 05-20-2008
    • Köln
    • Beiträge 11
    • Punkte 185

    AW: WPF Control mit Unity auflösen

    Hi Rainer,

    wie ich sehe willst du die Abhängigkeiten über Property Injection in dein LoginControl injeziert bekommen. Das Problem ist das du die LoginControl Instanz direkt im XAML erzeugst. Du musst aber dafür sorgen das dein UnityContainer die Instanz erzeugt, damit er die Abhängigkeiten injezieren kann. Dafür hat man sich überlegt Regions in XAML zu definieren. Guck dir nochmal an wie man Regions als Attached Property in XAML platziert und wie man den Regionmanager benutzen kann um Views (dein Login Control) zur Laufzeit in den Regions abzulegen.

    Gruß Grischa
    Microsoft Senior Student Partner
    Technische Universität Darmstadt
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 08-22-2008 8:40 Antwort zu

    • FantaMango77
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05-07-2008
    • Magdeburg, DE
    • Beiträge 90
    • Punkte 1.685
    • Moderator

    AW: WPF Control mit Unity auflösen

    Hallo,

    Ich denke den Region-Mechanismus hier zu verwenden, ist nicht angebracht. Das klingt für mich eher nach einem Woraround.

    Ich habe das Ganze so gemacht:
    Der Presenter, der an das Hauptformular gebunden ist hat eine Eigenschaft, die das LoginControlView veröffentlicht. Auf diese Weise kann das LoginControl an den Content eines ContentControls gebunden werden.

    Interface ILoginView:
    public interface ILoginView
    {
    ...
    }
    Klasse MainPresenter:
    public class MainPresenter : IMainPresenter
    {
        public ILoginView LoginView { get; private set; }
    
        public MainPresenter(ILoginView loginView)
        {
            LoginView = loginView;
        }
    
        ...
    
    }
    XAML-Code des Hauptformulars:
    <ContentControl Content="{Binding LoginView}" />

    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 09-06-2008 14:54 Antwort zu

    AW: WPF Control mit Unity auflösen

    Danke für die Rückmeldung. Werde ich nächste Woche mal ausprobieren und entsprechend posten ob ich damit so zurecht gekommen bin.
    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
  • 10-17-2008 17:10 Antwort zu

    AW: WPF Control mit Unity auflösen

    Answer
    Später als gedacht ... aber jetzt bin ich endlich dazu gekommen.

    Ich hab irgendwo noch ein Detail, das ich übersehe ... (muss dazu sagen, dass ich noch kein WPF programmiert habe, nur vor 1,5 Jahren Ein paar Tutorials gemacht und damals einen kleinen Prototypen mit kleinen Effekten gebaut). Ich Arbeite mich gerade erst ein.

    Ich habe mal das Testprojekt als Zip in den Anhang gelegt.

    EDIT: Fehlermeldung beim Laden ist "Content of a ContentControl must be a single element."
    So wie ich das jetzt sehe, liegt das daran, dass an ContentPresenter nur "ein" Panel, sprich also ein Wert dranhängen darf. Habe es bis jetzt aber nicht geschaft, es richtig umzubauen, dass es funktioniert.

    EDIT: Also ich habe jetzt die Lösung gefunden. In der Dokumentation ist es auch beschrieben, dass ContentControl nur ein Panel als Parent bekommen darf. Somit habe ich dem Grid in der Shell einen Namen (Container) gegeben. und kann so im Quellcode darauf zugreifen.

    1
    2
    3
    4
    5
    
    UIElement loginViewElement = LoginView as UIElement;
    if ( loginViewElement != null)
    {
        Container.Children.Add( loginViewElement);
    }
    Somit funktionier das gut!
    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
Seite 1 von 1 (5 Treffer)
Powered by Community Server (Commercial Edition)    Hosting powered by 69° media solutions