Eigene Messagebox erstellen im MVVM-Pattern

  • WPF MVVM
  • .NET 5–6

Es gibt 86 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Bin noch immer am rumknabbern an dem Beispiel von @VaporiZed in Post #2.

    Dazu einige Fragen:

    (1) In der DialogWindow.xaml findet sich folgende Zeile:

    XML-Quellcode

    1. <ContentPresenter Content="{Binding}"/>


    Mir ist klar, dass der Compiler da dann automatisch nach dem Binding sucht. Nur wie geht er dabei vor und wie würde das ausgeschrieben aussehen? Lieg ich da richtig dass der ContentPresenter da an eine Property, die das ViewModel hält, welches angezeigt werden soll, gebunden wird?

    (2) ...Und dass in dieser Zeile...:

    VB.NET-Quellcode

    1. Dim vm = New AccessPointViewModel(New Models.AccessPoint())

    ...AccessPointViewModel diese Property aus (1) ist?

    (3) Was mir auch komisch vorkommt ist, dass das DialogFenster sich bei einem Aufruf zwar öffnet, aber ohne Content. Selbst wenn ich testweise das hier in die DialogWindow.xaml schreibe:

    XML-Quellcode

    1. <Grid>
    2. <Grid.RowDefinitions>
    3. <RowDefinition Height="50*"/>
    4. <RowDefinition Height="50*"/>
    5. </Grid.RowDefinitions>
    6. <Button Background="Aquamarine" Content="Hallo" Grid.Row="0"/>
    7. <ContentPresenter Content="{Binding}" Grid.Row="1"/>
    8. </Grid>


    Woran kann das liegen?

    kafffee schrieb:

    Mir ist klar, dass der Compiler da dann automatisch nach dem Binding sucht. Nur wie geht er dabei vor und wie würde das ausgeschrieben aussehen? Lieg ich da richtig dass der ContentPresenter da an eine Property, die das ViewModel hält, welches angezeigt werden soll, gebunden wird?
    Nein.
    (oder vielleicht doch - ich verstehe nicht ganz, was du sagst)
    Ein Binding ohne Angabe der Source bindet an den aktuell gegebenen DataContext.
    Liegt der ContentPresenter in einem FolderBrowser(-View), so wirds wohl iwas aus dem FolderBrowser-Viewmodel sein - kommt drauf an wie der DataContext des FolderBrowser-Views gesetzt ist.
    @ErfinderDesRades

    Mal angenommen ich hab eine DialogWindowView (ein Fenster, kein UCL) und ein DialogWindowViewmodel. Plus für jede View (UCL) auch noch ein Viewmodel, denn es soll ein variabler Content in meinem DilaogWindow angezeigt werden (OK, Ja/Nein, Folder Browser, etc.). Dann sollte ich doch z. B. eine Property MeinContent As Viewmodel haben, auf das dann also mit dem besagten "Binding" gebunden wird oder? Und der Datacontext von DialogWindowView wird dann auf DialogWindowViewModel festgelegt dann sollte es funktionieren oder?

    Dann setze ich MeinContent auf das gewünschte ViewModel und rufe auf:
    Dim vm = MeinContent, denn ich habe ja in der App.xaml meine DataTemplates festgelegt, welche View zu welchem ViewModel "gehört"...

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „kafffee“ ()

    kafffee schrieb:

    Und der Datacontext von DialogWindowView wird dann auf DialogWindowViewModel festgelegt dann sollte es funktionieren oder?
    Er wird gebunden (Xaml), nicht festgelegt (CodeBehind).
    Ansonsten blick ich nicht sicher durch, bei deine DialogWindowView, DialogWindowViewmodel, Viewmodel, DilaogWindow und 'Property MeinContent As Viewmodel' - was da wo festgelegt oder gebunden wird.
    Aber probiers doch aus, und sag, obs funzt wie soll.

    ErfinderDesRades schrieb:


    Aber probiers doch aus, und sag, obs funzt wie soll.

    Ja Problem ist soweit komm ich gar nicht erst, das scheitert schon am Anzeigen eines "starren" Contents in meinem DialogWindow, wie von mir in meinem vorletzten Post bereits erwähnt... Ich muss irgendwie einen Fehler im Anpassen des Codes von @Nofear23m im Beispiel von @VaporiZed aus Post 2 gemacht haben...
    ich weiss grad nicht, was das konkrete Problem ist.
    Möchtest du die Features eines ContentPresenters erproben?
    Also wie er den DataContext aus seiner Xaml-Umgebung "erbt", und wie er bei verschiedenen Inhalten verschiedene DataTemplates anwendet?
    Da muss sich doch ein einfaches Beispiel für basteln lassen.

    ErfinderDesRades schrieb:

    Also wie er den DataContext aus seiner Xaml-Umgebung "erbt", und wie er bei verschiedenen Inhalten verschiedene DataTemplates anwendet?


    Ja ganz genau das. Aber momentan komm ich gar nicht so weit, weil er mir zwar das Dialogfenster öffnet, aber nur ein leeres Fenster, selbst wenn ich das ganze mit dem ContentPresenter weglasse wie in Post 41 (drittes Codebeispiel).

    Es muss also an was anderem liegen. Ich glaub es ist der Aufruf: Momentan mache ich das testweise so:

    dialogService.ShowModalDialog("newAp", Nothing, Me, True, True)

    Ich vermute, dass ShowModalDialog zwingend ein ViewModel als zweiten Parameter braucht, um ein nicht leeres Fenster anzuzeigen, obwohl die DialogFensterView einen Button drinhat, also dass mein DilaogWindowService überhaupt nur für wechselnde Inhalte gebaut ist:

    VB.NET-Quellcode

    1. Imports DialogFensterTest2.ViewModel.Services
    2. Namespace Services
    3. Public Class DialogWindowService
    4. Implements IDialogWindowService
    5. Private _currentSpsWindow As View.DialogFenster
    6. Public Function ShowModalDialog(windowname As String, datacontext As Object, owner As Object, Optional topMost As Boolean = False, Optional showInTaskbar As Boolean = True) As Boolean Implements IDialogWindowService.ShowModalDialog
    7. Dim spswin As New View.DialogFenster(windowname, datacontext, SizeToContent.WidthAndHeight, WindowStartupLocation.CenterOwner)
    8. _currentSpsWindow = spswin
    9. spswin.Topmost = topMost
    10. spswin.ShowInTaskbar = showInTaskbar
    11. spswin.Owner = spswin.FindOwnerWindow(owner)
    12. Return CType(Application.Current.Dispatcher.Invoke(Function() spswin.ShowDialog), Boolean)
    13. End Function
    14. Public Sub CloseDialog() Implements IDialogWindowService.CloseDialog
    15. If _currentSpsWindow IsNot Nothing Then
    16. _currentSpsWindow.Close()
    17. End If
    18. End Sub
    19. End Class
    20. End Namespace


    Kann aber sein dass ich da komplett auf dem Holzweg bin...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kafffee“ ()

    Hallo

    Ich habe versucht die Posts so sinnerfassen wie möglich zu lesen.

    kafffee schrieb:

    Ich vermute, dass ShowModalDialog zwingend ein ViewModel als zweiten Parameter braucht

    Na auf jeden Fall.

    Im Konstruktor des DialogWindow hast du ja Code welcher das übergebene ViewModel für das Fenster als DataContext setzt. Du MUSST also ein ViewModel übergeben damit etwas angezeigt werden kann.
    Hast du dann einen DataContext am Fenster (weil du ein VM übergeben hast) wird der ContentPresenter darauf gebunden.

    Durch das von dir festgelegte (was du so geschrieben hast in der App.xaml) DataTemplate geht die WPF nun her und sagt. "Ok, der ContentPresenter hat nun als Binding ein "XYZViewModel" bekommen. Ich gehe mal los und schau nach ob irgendwo ein DataTemplate für diesen Typ definiert wurde." Wir die WPF dann in der App.xaml fündig nimmt sie den Inhalt des DataTemplates und rendert ihn im ContentPresenter.

    Übergibst du kein ViewModel an das Dialogfenster, wie um gottes Willen soll die WPF riechen was du genau anzeigen willst.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    kafffee schrieb:

    Ich vermute, dass ShowModalDialog zwingend ein ViewModel als zweiten Parameter braucht
    Na wenn dem so ist, wieso ist es überhaupt möglich, es falsch (also ohne den zweiten Parameter) aufzurufen?
    Ich kenne nicht wirklich das System, mit dem ihr arbeitet, aber das riecht mir nach einem Architekturfehler im System.

    Edit: Ok, mehr kann ein System nicht machen - ein bischen "selber schuld" wird immer übrig bleiben :P .
    (Doch, theoretisch könnte man das abprüfen, und eine InvalidArgumentException werfen, oder ArgumentNull. Also ich korrigiere: ein ganz klein bischen "selber schuld"sollte man sogar übrig lassen)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Naja, wenn er als Parameter für ein ViewModel ​Nothing übergibt hat das nichts mit einem Architekturfehler zu tun, lediglich eine Abfrage über Nothing als Parameter übergeben wurde wäre hier im Konstruktor hilfreich, aber das ist eben Sache der Implementierung innerhalb des Konstruktors des "DialogWindow".

    Aber man sollte eben die Intellisens verwenden, und wenn dort als Parameter "datacontext As ViewModelBase" steht dann sollte man sich Gedanken darüber machen ob man da nicht evtl. ein ViewModel übergeben sollte ^^
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Ich habe versucht die Posts so sinnerfassen wie möglich zu lesen.


    Hast du komplett richtig interpretiert. :)

    Nofear23m schrieb:

    Im Konstruktor des DialogWindow hast du ja Code welcher das übergebene ViewModel für das Fenster als DataContext setzt. Du MUSST also ein ViewModel übergeben damit etwas angezeigt werden kann.
    Hast du dann einen DataContext am Fenster (weil du ein VM übergeben hast) wird der ContentPresenter darauf gebunden.


    Und genau da liegt wahrscheinlich der Fehler bei mir :/

    In dem Beispielprogramm aus dem Link in Post #2 (PWM.zip) hast du den Konstruktor:

    VB.NET-Quellcode

    1. Public Class AccessPointViewModel : Inherits ViewModelBase
    2. Public ReadOnly AccessPoint As AccessPoint = Nothing
    3. Public Event DeleteAccessPoint As EventHandler
    4. Sub New()
    5. AccessPoint = New AccessPoint With {.Name = "Foo"}
    6. End Sub
    7. Sub New(AccessPoint As AccessPoint)
    8. Me.AccessPoint = AccessPoint
    9. End Sub


    Welche Rolle spielt AccessPoint hier? Und was für ein Typ ist das? Hab nirgendwo eine Definition gefunden?!
    Ich hab versucht deine Worte zu interpretieren und dachte da eher an:

    VB.NET-Quellcode

    1. Public Sub New(vm As ViewModel.Instrastructure.ViewModelBase)
    2. View.DialogfensterView.DataContext = vm
    3. 'oder
    4. Me.DataContext.Me
    5. End Sub


    Aber das streicht er mir rot an...

    Mein Aufruf sieht so aus:

    VB.NET-Quellcode

    1. Private Sub OKDialogOeffnen_Execute(obj As Object)
    2. Dim vm = New ViewModel.DialogFensterViewModel(New OKDialogViewModel)
    3. Dim dialogService = ServiceContainer.GetService(Of IDialogWindowService)
    4. dialogService.ShowModalDialog("newAp", vm, Me, True, True)
    5. End Sub


    Aber das hab ich glaube ich auch falsch erfasst...

    OKDialogViewModel ist dabei der DataContext von meinem UCL OKDialogView in der View...

    Ich hänge das Testprojekt mal an:
    Dateien
    Du vermischt aber nun zwei komplett verschiedene Projekte miteinander. AccessPointViewmodel ist doch von einem anderen User.

    Ich habe ein funktionierendes Beispiel hochgeladen. Bevor du es nun für dich umbaust solltest du versuchen dieses zu verstehen. Gehe den Code genau durch und melde dich bei Fragen.
    Es bringt dir nichts wenn ich jetzt dein Projekt ausbessere und morgen stehst du vor genau dem selben Problem.

    Verstehen ist nun wichtig.
    Bei Fragen bis ich ja da.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Das schon, aber du fragst nun nach einem Konstruktor der mit der eigentlichen Sache nichts zu tun hat.

    Ich habe genau Beschrieben wo dein Fehler liegt, wenn du die Erklärung nicht versteht dann Frag bitte nach, NACHDEM du dir die Codestellen angesehen hast und versucht hast diese zu verstehen.
    Glaub mir, nur so ist die Hilfe nachhaltig. Ich meine es nur gut :)

    Gruß
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m

    Ich hab mal den Designtime-Support "eingeschaltet":

    Irgendwas mach ich richtig, wenn ich als DataContext mein JaNeinDialogViewModel angebe, wird das richtige angezeigt im Designer...

    Bloss das dann zur Laufzeit zu setzen krieg ich noch nicht hin...

    Ich hab jetzt meinen ContentPresenter folgendermassen:
    <ContentPresenter Content="{Binding}"/>

    und in meinem DialogFensterViewModel:

    VB.NET-Quellcode

    1. Public Sub New(vm As ViewModel.Instrastructure.ViewModelBase)
    2. Me.Content = vm
    3. End Sub
    4. Private _Content As Object
    5. Public Property Content() As Object
    6. Get
    7. Return _Content
    8. End Get
    9. Set(ByVal value As Object)
    10. _Content = value
    11. RaisePropertyChanged()
    12. End Set
    13. End Property


    Nun würde ich gerne mal was ausprobieren, und zwar bei dem DesignTime Support mal auf DialogFensterViewModel setzen und gucken was passiert. Wenn ich dann per Code den DataContext von DialogFensterViewModel auf JaNeinDialogViewModel setze sollte das doch gehen meines Verständnisses nach...? Leider schlägt mir die IntelliSense DialogFensterViewModel nicht vor und ich hab keinen Plan wieso eigentlich nicht... Kannst du mir einen Tipp geben woran das liegen kann?

    @Nofear23m
    OK ich glaube da war ich auf der falschen Fährte... Ich weiss zwar immer noch nicht warum mir IntelliSense alle anderen ViewModels vorschlägt bloss nicht DialogFensterViewModel aber seis drum.

    Jetzt weiss ich was du mit dem Kontruktor vom DialogFenster meinst, du meinst in der DailogFenster.xaml.vb (ich hatte da immer an DialogFensterViewModel.vb gedacht):

    VB.NET-Quellcode

    1. Public Sub New(windowname As String, datacontext As Object, widthAndHeight As SizeToContent, centerOwner As WindowStartupLocation)
    2. Me.windowname = windowname
    3. Me.DataContext = datacontext
    4. Me.widthAndHeight = widthAndHeight
    5. Me.centerOwner = centerOwner
    6. End Sub


    Was ich nicht verstehe ist, dass wenn ich das jetzt aufrufe:

    VB.NET-Quellcode

    1. Dim dialogService = ServiceContainer.GetService(Of IDialogWindowService)
    2. dialogService.ShowModalDialog("Mein Fenstertitel", New ViewModel.OKDialogViewModel, Me, True, True)


    Immer noch ein leeres Fenster kommt. Ich habe doch das ViewModel nun korrekt übergeben?? Und:

    Welche Rolle spielt Me.windowname? Soll das der Name des Windows sein? Oder der Text der in der Titelleiste angezeigt wird? Bei letzterem müsste doch wenigstens der angezeigt werden, wenn ich das Fenster öffne, selbst wenn das mit dem Content nicht funktioniert??

    Was ich auch nicht verstehe:

    Warum wird mir im Designer das DialogFenster mit dem richtigen Content angezeigt, wenn ich das mache:

    XML-Quellcode

    1. ​mc:Ignorable="d" d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type={x:Type viewmodel:JaNeinDialogViewModel}}"


    Wenn ich aber das mache:

    XML-Quellcode

    1. <Window.DataContext>
    2. <viewmodel:JaNeinDialogViewModel/>
    3. </Window.DataContext>


    Passiert zur Laufzeit wieder gar nichts...

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „kafffee“ ()

    kafffee schrieb:

    und in meinem DialogFensterViewModel:

    Ne, das gehört da nicht rein, haste aber eh selbst gemerkt.

    Ich habe in Post 31 ein funktionierende Beispiel gepostet, baue auf dieses auf.

    kafffee schrieb:

    Passiert zur Laufzeit wieder gar nichts...

    Das kann viele Gründe haben, evtl. rufst du sowieso ein falsche Fenster auf. Hast du "meines" übernommen oder ein eigenes gemacht.
    Wie sieht dein DataTemplate aus?
    Wie genau die ShowModalDialog Methode in der Serviceimplementierung?

    Viele Fragen. Es gibt einige stelle wo man es verbocken kann, deshalb ist es ja so wichtig das man es verstehen lernt. Haltepunkt machen und durchgehen.
    Gehe mein Beispiel mal genau durch, probiere in diesem dann ein neues UserControl und ein neues ViewModel anzulegen und diese in einem Dialog aufzurufen.
    Einfach ein bischen damit spielen, so kommt man ganz gut drauf auf was es ankommt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich glaube ich gebs jetzt dann nach 3 Wochen erstmal auf. Selbst wenn ich das Fenster zum Anzeigen bekomme dann muss ich das Ganze immer noch in mein Projekt integrieren und mich um einen Rückgabewert kümmern. Kein leichtes Spiel wie ich finde, zu viel Code an zu viel verschiedenen Stellen... Und mit Events im .Net-Code hab ich auch noch nie gearbeitet...
    Wenn ich mir dein Post 33 durchlese versteh ich zwar einen grossen Teil, aber selber damit arbeiten trau ich mir nicht so ganz zu...
    Ich hoffe mir ist jetzt keiner böse wegen der rein gesteckten Energie aber ich seh um jetzigen Zeitpunkt einfach keinen Weg für mich...

    Alternativ wollte ich dann mit Code Behind das Ganze lösen... Gibt es denn einen Weg, dem Viewmodel eine Code Behind-Klasse (*.xaml.vb) bekannt zu machen, so dass es auf diese zugreifen kann?

    Grüssle ausm Schwabenland,

    kafffee

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „kafffee“ ()

    Aber was genau hindert Dich denn jetzt daran, das Beispiel von @Nofear23m mal in Ruhe durch zu gehen?
    Lege DEIN Projekt auf Seite, starte Saschas Projekt und schaue es Dir KOMPLETT an.
    Füge was hinzu, gucke ob es klappt.
    Wenn Du dann alles verstanden hast, dann kannste Dein Projekt wieder hervor holen.

    Und BITTE... NIEMALS die View ins ViewModel holen. Man macht keine View CodeBehind ins ViewModel!!

    Tatsächlich ist es nicht wirklich schwer. Man verzettelt sich halt immer nur wenn man Code von anderen versucht in sein eigenes Projekt zu bauen. Daher ist es extrem wichtig, zu VERSTEHEN wie der Code funktioniert damit man ihn verwenden kann.

    Ich könnte Dir auch ein Beispiel zusammen bauen, aber ohne DAS zu verstehen kommste dann auch wieder nicht weiter.

    Also... Gehe das Projekt von Sascha komplett durch, bastel daran rum und versuche es zu verstehen!!
    "Hier könnte Ihre Werbung stehen..."
    Edit (bevor ihr jetzt den Rest lest....):
    Haaaa ich habs endlich hinbekommen. :thumbsup: Es lag an der CodeBehind von meinem DialogFenster, ich war so auf MVVM fixiert, dass ich die glatt vergessen hatte... Ich sag nur zwei Worte: Sofa und Geistesblitz... Jetzt muss ich mich noch darum kümmern, einen Messagetext zu übergeben und ein Event fürs Schliessen und Übergeben des Results zu erstellen (hab mich da in der Zwischenzeit mal ein bisschen reingelesen...)


    Nofear23m schrieb:

    Das kann viele Gründe haben, evtl. rufst du sowieso ein falsche Fenster auf. Hast du "meines" übernommen oder ein eigenes gemacht.
    Wie sieht dein DataTemplate aus?
    Wie genau die ShowModalDialog Methode in der Serviceimplementierung?


    Hab ein eigenes gemacht:

    XML-Quellcode

    1. <Window x:Class="DialogFenster"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:DialogFensterTest2.View"
    7. xmlns:viewmodel="clr-namespace:DialogFensterTest2.ViewModel;assembly=DialogFensterTest2.ViewModel"
    8. mc:Ignorable="d" d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type={x:Type viewmodel:JaNeinDialogViewModel}}"
    9. Name="MeinDialog"
    10. Title="DialogFenster" Height="450" Width="800">
    11. <Window.DataContext>
    12. <viewmodel:JaNeinDialogViewModel/>
    13. </Window.DataContext>
    14. <ContentPresenter Content="{Binding}"/>
    15. </Window>


    Mein DataTemplate:

    XML-Quellcode

    1. <Application x:Class="Application"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:local="clr-namespace:DialogFensterTest2.App"
    5. xmlns:view="clr-namespace:DialogFensterTest2.View;assembly=DialogFensterTest2.View"
    6. xmlns:viewmodel="clr-namespace:DialogFensterTest2.ViewModel;assembly=DialogFensterTest2.ViewModel"
    7. StartupUri="MainWindow.xaml">
    8. <Application.Resources>
    9. <DataTemplate DataType="{x:Type viewmodel:JaNeinDialogViewModel}">
    10. <view:JaNeinDialogView/>
    11. </DataTemplate>
    12. <DataTemplate DataType="{x:Type viewmodel:OKDialogViewModel}">
    13. <view:OKDialogView/>
    14. </DataTemplate>
    15. </Application.Resources>
    16. </Application>


    Und die ShowDialog-Methode:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports DialogFensterTest2.ViewModel.Services
    3. Namespace Services
    4. Public Class DialogWindowService
    5. Implements IDialogWindowService
    6. Private _currentSpsWindow As View.DialogFenster
    7. Public Function ShowModalDialog(windowname As String, datacontext As Object, owner As Object, Optional topMost As Boolean = False, Optional showInTaskbar As Boolean = True) As Boolean Implements IDialogWindowService.ShowModalDialog
    8. Dim spswin As New View.DialogFenster(windowname, datacontext, SizeToContent.WidthAndHeight, WindowStartupLocation.CenterOwner)
    9. _currentSpsWindow = spswin
    10. spswin.Topmost = topMost
    11. spswin.ShowInTaskbar = showInTaskbar
    12. spswin.Width = 100
    13. spswin.Owner = spswin.FindOwnerWindow(owner)
    14. Return CType(Application.Current.Dispatcher.Invoke(Function() spswin.ShowDialog), Boolean)
    15. End Function
    16. Public Sub CloseDialog() Implements IDialogWindowService.CloseDialog
    17. If _currentSpsWindow IsNot Nothing Then
    18. _currentSpsWindow.Close()
    19. End If
    20. End Sub
    21. End Class
    22. End Namespace


    Wenn das zur DesignTime richtig angezeigt wird, das heisst doch das mit den DataTemplates in der App.xaml funktioniert oder? Und das richtige Fenster rufe ich auch auf:
    Dim spswin As New View.DialogFenster(windowname, datacontext, SizeToContent.WidthAndHeight, WindowStartupLocation.CenterOwner)

    Kann das daran liegen, dass in Zeile 15 folgender Fehler (hellgrün unterstrichen) ist:
    Zugriff des freigegebenen Members, konstanten Members, Enumerationsmembers oder geschachtelten Typs über eine Instanz; der qualifizierende Ausdruck wird nicht ausgewertet.

    Das sagt mir so nichts...

    MichaHo schrieb:

    Also... Gehe das Projekt von Sascha komplett durch, bastel daran rum und versuche es zu verstehen!!

    Ich starre grad seit ner Stunde oder so meinen Bildschirm an und mein Kopf bleibt einfach leer... Das ist einfach wie gesagt sehr viel Code... Ich probiers aber weiterhin simultan...

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „kafffee“ ()

    kafffee schrieb:

    Haaaa ich habs endlich hinbekommen.

    Erstmal Gratulation. Man gibt nicht auf, das ist ein Zeichen von Schwäche ;)

    kafffee schrieb:

    Es lag an der CodeBehind von meinem DialogFenster

    Hättest du einfach meines genommen denn....

    kafffee schrieb:

    Hab ein eigenes gemacht:

    Naja, hier hast du jetzt aber einen fixen DataContext hinterlegt. Der Clou an "meiner" implementierung ist ja das du EIN Window hast welches ein Container für alle möglichen Dialog darstellt.

    So kannst du dann eben von einem VM aus jedes x-beliebige ViewModel übergeben und solange es dafür ein DataTemplate gibt wird es gerendert, und in diesem Fall ist ein Rückgabewert das das einfachste weil du ja einfach ne Property in deinem VM dafür haben müsstest. Fertig.

    Wenn du aufgeben willst halte ich dich nicht auf, ist evtl. einfach noch zu früh für dich.
    Das einzige was ich anbieten kann (das wars das aber) ist das wir morgen Nachmittag/Abend eine Discord Session machen um das ganze mal durchzugehen, evtl. wird dann einige klarer.
    Da kann übrigens jeder gerne Teilnehmen, dann nehmen wir hald Services durch bis zum umfallen, ist ja auch ein komplexeres Thema, aber dafür ist es super genial dann in der Anwendung.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##