.
Anmeldung | Registrieren | Hilfe
in Suchen

[WPF MVVM] MVVM Light Messenger / Nachrichten kommen nicht an.

Letzter Beitrag 15. Jul 2016 1:04 von ErnstAugust. 0 Antworten.
Seite 1 von 1 (1 Treffer)
Beiträge sortieren: Zurück Weiter
  • 15. Jul 2016 1:04

    • ErnstAugust
    • Nicht gereiht
    • Registriert am 15. Jul 2016
    • Beiträge 1
    • Punkte 5

    [WPF MVVM] MVVM Light Messenger / Nachrichten kommen nicht an.

    Hallo zusammen, 
    wie soll es auch anders sein, aber ich habe ein Problem mit dem MVVM Light Messenger, oder ich gehe das ganze Falsch an. Aber von Anfang an.
    Ich bin Anfänger was WPF MVVM und c# angeht. Ich habe es mehr mit prozeduralen Sprachen. Aber was ich machen will ist folgendes. Ich baue mir mit FirstFloor Modern UI  eine WPF Anwendung und Versuche mich an dem Model View ViewModel MVVM-Pattern. Das Programm zeigt nach dem Start den Login_View nach dem sich der Benutzer erfolgreich Angemeldet hat soll das Login_View verschwinden und ein Menü angezeigt werden. Jetzt muss das Login_ViewModel dem MainViewModel ja sagen das 
    der Login versuch funktioniert hat.
    Habe unter anderem auch hier im Forum gelesen das man das mit Commands bzw. mit Messaging am besten löst, weil sonst müssten sich ja das Login_ViewModel und das Mainwindow_ViewModel kennen.

    Für das Messaging habe mit das Tutorial  erkoren. Aber irgendwas mach ich noch falsch. Denn der erfolgte Login kommt nicht im MainWindow_Viewmodel an.

    Hier mal mein Code
    Das Login_Model im Model Ordner
    using GalaSoft.MvvmLight;
    
    
    
    using FirstFloor.ModernUI.Presentation;
    
    
    
    namespace PrismTest.Model
    
    {
    
       public  class Login_Model : ViewModelBase 
    
        {
    
            private string _username;
    
            public string Username
    
            {
    
                get { return _username; }
    
                set
    
                {
    
                    if (_username != value)
    
                        _username = value;
    
                }
    
            }
    
    
    
            private string _password;
    
            public string Password
    
            {
    
                get { return _password; }
    
                set
    
                {
    
                    if (_password != value)
    
                        _password = value;
    
                }
    
            }
    
        }
    
    }

    Login_View.xml im View Ordner
    <UserControl x:Class="PrismTest.View.Login"
    
                 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:mui="http://firstfloorsoftware.com/ModernUI"
    
                 xmlns:local="clr-namespace:PrismTest.ViewModel"
    
                 mc:Ignorable="d" 
    
                 d:DesignHeight="300" d:DesignWidth="300">
    
        <UserControl.Resources>
    
            <ResourceDictionary>
    
                <local:Login_ViewModel x:Key="Login_ViewModel" /> 
    
            </ResourceDictionary>
    
        </UserControl.Resources>
    
        <Grid Style="{StaticResource ContentRoot}">
    
            <ScrollViewer>
    
                <StackPanel MinWidth="200">
    
                    <TextBlock Text="Login View" Style="{StaticResource Heading2}" />
    
                    <Grid Margin=" 0 10 0 0" MaxWidth="300" VerticalAlignment="Center" DataContext="{StaticResource Login_ViewModel}">
    
                        <Grid.ColumnDefinitions>
    
                            <ColumnDefinition Width=".5*"/>
    
                            <ColumnDefinition />
    
                        </Grid.ColumnDefinitions>
    
                        <Grid.RowDefinitions>
    
                            <RowDefinition Height="Auto"/>
    
                            <RowDefinition Height="Auto"/>
    
                            <RowDefinition Height="Auto"/>
    
                        </Grid.RowDefinitions>
    
                        <Label Grid.Row="0" Grid.Column="0" Name="username" Content="Benutzername: " Margin="0 0 0 5" VerticalAlignment="Center"/>
    
                        <Label Grid.Row="1" Grid.Column="0" Name="password" Content="Password: " VerticalAlignment="Center" />
    
    
    
                        <TextBox Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" Margin="0 0 0 5"
    
                                 DataContext="{Binding LoginModel}" Text="{Binding Username, Mode=TwoWay}"/>
    
                        <PasswordBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Center"
    
                                     DataContext="{Binding LoginModel}"/>
    
    
    
                        <Button Grid.Row ="2" Grid.Column="1" Width="70" Content="OK" HorizontalAlignment="Right" Margin=" 0 10 0 0"
    
                                 Command="{Binding LoginCommand}"/>
    
                    </Grid>
    
                </StackPanel>
    
            </ScrollViewer>
    
        </Grid>
    
    </UserControl>

    Login_ViewModel im ViewModel Ordner 
    using GalaSoft.MvvmLight;
    
    using PrismTest.Model;
    
    using FirstFloor.ModernUI.Presentation;
    
    
    
    namespace PrismTest.ViewModel
    
    {
    
        public class Login_ViewModel : ViewModelBase
    
        {
    
            private Login_Model _login_m = new Login_Model();
    
    
    
            public RelayCommand LoginCommand { get; set; }
    
    
    
            public Login_Model LoginModel
    
            {
    
                get { return _login_m; }
    
            }
    
    
    
            public Login_ViewModel()
    
            {
    
                LoginCommand = new RelayCommand(CheckLogin);
    
            }
    
    
    
            private void CheckLogin(object obj)
    
            {
    
                //Eigentlich gegen DB Prüfen ob Benutzer existiert ist ja nur demo
    
                System.Windows.MessageBox.Show("yes");
    
                MessengerInstance.Send<Login_Model>(_login_m);
    
    
    
            }
    
        }
    
    }

    MainViewModel im ViewModel Ordner [hat MVVM Light angelegt]
    using GalaSoft.MvvmLight;
    
    using PrismTest.Model;
    
    
    
    namespace PrismTest.ViewModel
    
    {
    
        /// <summary>
    
        /// This class contains properties that the main View can data bind to.
    
        /// <para>
    
        /// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
    
        /// </para>
    
        /// <para>
    
        /// You can also use Blend to data bind with the tool's support.
    
        /// </para>
    
        /// <para>
    
        /// See http://www.galasoft.ch/mvvm
    
        /// </para>
    
        /// </summary>
    
        public class MainViewModel : ViewModelBase
    
        {
    
            /// <summary>
    
            /// Initializes a new instance of the MainViewModel class.
    
            /// </summary>
    
            public MainViewModel()
    
            {
    
                System.Windows.MessageBox.Show("I'm runing");
    
                MessengerInstance.Register<Login_Model>(this, LoginSuccess);
    
                ////if (IsInDesignMode)
    
                ////{
    
                ////    // Code runs in Blend --> create design time data.
    
                ////}
    
                ////else
    
                ////{
    
                ////    // Code runs "for real"
    
                ////}
    
            }
    
    
    
            public void LoginSuccess(Login_Model lm)
    
            {
    
                System.Windows.MessageBox.Show("Event ist durch " + lm.Username);
    
            }
    
    
    
        }
    
    }

    und  MainWindow.xaml
    <mui:ModernWindow x:Class="PrismTest.MainWindow"
    
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    
            xmlns:mui="http://firstfloorsoftware.com/ModernUI"
    
            Title="Test" IsTitleVisible="True"
    
           ContentSource="/View/login.xaml">
    
    
    
     <!--   <mui:ModernWindow.MenuLinkGroups>
    
            <mui:LinkGroup DisplayName="welcome">
    
                <mui:LinkGroup.Links>
    
                    <mui:Link DisplayName="home" Source="/Pages/Home.xaml" />
    
                </mui:LinkGroup.Links>
    
            </mui:LinkGroup>
    
            <mui:LinkGroup DisplayName="settings" GroupKey="settings">
    
                <mui:LinkGroup.Links>
    
                    <mui:Link DisplayName="software" Source="/Pages/SettingsPage.xaml" />
    
                </mui:LinkGroup.Links>
    
            </mui:LinkGroup>
    
        </mui:ModernWindow.MenuLinkGroups>
    
        
    
        <mui:ModernWindow.TitleLinks>
    
            <mui:Link DisplayName="settings" Source="/Pages/SettingsPage.xaml" />
    
            <mui:Link DisplayName="help" Source="https://github.com/firstfloorsoftware/mui" />
    
        </mui:ModernWindow.TitleLinks> -->
    
    </mui:ModernWindow>
    und der code behind dazu 
    using PrismTest.ViewModel;
    
    
    
    namespace PrismTest
    
    {
    
        /// <summary>
    
        /// Interaction logic for MainWindow.xaml
    
        /// </summary>
    
        public partial class MainWindow : ModernWindow
    
        {
    
            public MainWindow()
    
            {
    
                InitializeComponent();
    
                MainViewModel mvm = new MainViewModel();
    
            }
    
        }
    
    }

    Die Datei ViewModelLocator hat das MVVM Light angelegt im ViewModel Ordner

    using GalaSoft.MvvmLight;
    
    using GalaSoft.MvvmLight.Ioc;
    
    using Microsoft.Practices.ServiceLocation;
    
    
    
    namespace PrismTest.ViewModel
    
    {
    
        /// <summary>
    
        /// This class contains static references to all the view models in the
    
        /// application and provides an entry point for the bindings.
    
        /// </summary>
    
        public class ViewModelLocator
    
        {
    
            /// <summary>
    
            /// Initializes a new instance of the ViewModelLocator class.
    
            /// </summary>
    
            public ViewModelLocator()
    
            {
    
                ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    
    
    
                ////if (ViewModelBase.IsInDesignModeStatic)
    
                ////{
    
                ////    // Create design time view services and models
    
                ////    SimpleIoc.Default.Register<IDataService, DesignDataService>();
    
                ////}
    
                ////else
    
                ////{
    
                ////    // Create run time view services and models
    
                ////    SimpleIoc.Default.Register<IDataService, DataService>();
    
                ////}
    
    
    
                SimpleIoc.Default.Register<MainViewModel>();
    
            }
    
    
    
            public MainViewModel Main
    
            {
    
                get
    
                {
    
                    return ServiceLocator.Current.GetInstance<MainViewModel>();
    
                }
    
            }
    
            
    
            public static void Cleanup()
    
            {
    
                // TODO Clear the ViewModels
    
            }
    
        }
    
    }


    Auch wenn es ein unschöne Lösung ist mit MessageBoxen zu Überprüfen ob Code ausgeführt wird, kann ich aber sagen, dass die MessageBoxen "I'm running" aus dem MainViewModel gleich nach dem Start der Anwendung angezeigt wird und auch das "Yes" aus dem Login_ViewModel wird nach dem Klick auf den OK Button angezeigt. 
    Nur das "Event ist durch" funktioniert nicht. 
    Kann mir jemand sagen was ich falsch machen und somit das MessengerInstance.Send<Login_Model>(_login_m); aus dem Login_ViewModel nicht in dem MainViewModel MessengerInstance.Register<Login_Model>(this, LoginSuccess); ankommt. 

    Vielen Dank schon mal für das Lesen und die Hilfe. 
           

                
    • IP-Adresse ist Registriert
Seite 1 von 1 (1 Treffer)

Regeln | Impressum