Autor Beitrag
Ernst77
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 19.07.16 12:21 
Hallo zusammen,
<<Ich hoffe mal das ich die richtige Sparte gewählt habe>>
wie soll es auch anders sein, aber ich habe ein Problem mit dem MVVM Light Messenger und mach da 100%ig noch was Falsch an. Aber von Anfang an.

Ich baue mir mit Modern UI von FirstFloor eine WPF Anwendung zusammen und verwende das Model View ViewModel (MVVM) Pattern.
Das Programm zeigt nach dem Start das Login_View an. Nach dem sich der Benutzer erfolgreich Angemeldet hat soll das Login_View verschwinden und ein Menü im Main_View angezeigt werden. Jetzt muss das Login_ViewModel dem MainViewModel ja sagen das der Login versuch funktioniert hat.
Da habe ich mit gedacht das ich das mit Messages mache. (jetzt kann man das ja mit Prism oder MVVM-Light machen)
Also habe ich mit MVVM Light von GalaSoft installiert.
In dem Login_ViewModel sende ich über "Messenger.Default.Send(...)" eine Nachricht und in dem MainWindow_ViewModel registriere sich mit "Messenger.Default.Register..." auf die Nachricht.

Der Code für das Registrieren bzw. Senden wird auch durchlaufen, aber nach dem Senden der Nachricht reagiert das MainWindow_ViewModel nicht und ich habe keine Ahnung was ich falsch mache. Ich hoffe doch sehr das Ihr mir helfen könnt.

Hier mein Code

Das Login_Model
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
using GalaSoft.MvvmLight;
using FirstFloor.ModernUI.Presentation;

namespace MVVMLightTest.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;
            }
        }

        private string _role;
        public string Role
        {
            get { return _role; }
            set
            {
                if (_role != value)
                    _role = value;
            }
        }

    }
}


Das Login_View
ausblenden volle Höhe XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
<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:MVVMLightTest.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>


Das Login_ViewModel
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
using GalaSoft.MvvmLight;
using MVVMLightTest.Model;
using FirstFloor.ModernUI.Presentation;

namespace MVVMLightTest.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("Login_View_Model yes");
            Login_Model _login_m = new Login_Model();
            _login_m.Username = "Test";
            _login_m.role = "Admin";
            Messenger.Default.Send<Login_Model>(_login_m);
        }
    }
}


Das MainWindow_View
Das Auskommentierte Menü soll dann in Abhängigkeit der UserRole in MainWindow_viewModel zur Laufzeit generiert werden
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
<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>

Code Behind des MainWindow_View
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
using PrismTest.ViewModel;
namespace MVVMLightTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : ModernWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            MainWindow_ViewModel mvm = new MainWindow_ViewModel();
        }
    }
}


Das MainWindow_ViewModel
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
using GalaSoft.MvvmLight;
using MVVMLightTest.Model;

namespace MVVMLightTest.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 MainWindow_ViewModel: ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            System.Windows.MessageBox.Show("I'm runing");
            Messenger.Default.Register<Login_Model>(this,  ( action ) => ReceiveMessage( LoginSuccess) );
            ////if (IsInDesignMode)
            ////{
            ////    // Code runs in Blend --> create design time data.
            ////}
            ////else
            ////{
            ////    // Code runs "for real"
            ////}
        }

        private object LoginSuccess(Login_Model lm)
        {
            System.Windows.MessageBox.Show("Message ist durch " + lm.Username);
        }
    }
}


Wenn ich den Code ausführe, dann kommt direkt nach dem start der Anwendung die Messagebox mit dem Text "I'm running" und dann die Messagebox mit "Login_View_Model yes" wenn man auf den OK-Butten klickt. Nur das "Message ist durch..." aus dem MainWindow_ViewModel kommt nicht. Wenn ich im Debugmodus Schrittweise durch den Code hangel, dann sehe ich auch, dass das MainWindow_ViewModel sich auch für die Nachricht Registriert und das im Login_ViewModel die Codzeile mit dem Send durchlaufe wird.
Nur warum funktioniert es dann doch nicht?

Vielen Dank schon mal für das ganze lesen und die Hilfe
Ernst


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Di 19.07.2016 um 13:36