Laden...

[Erledigt]MVVM : Konstruktor wird 2x aufgerufen

Erstellt von Ahrimaan vor 12 Jahren Letzter Beitrag vor 12 Jahren 823 Views
A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 12 Jahren
[Erledigt]MVVM : Konstruktor wird 2x aufgerufen

Hallo zusammen,
ich habe ein Phänomen und ich weiß nicht wie ich das umschiffen soll:
Eine View kriegt beim Aufruf eine ID zugewiesen.
Diese View wird in ein Workspace geladen.
Nur leider wird der Konstruktor 2x aufgerufen :

ResourceDictionary :

    <DataTemplate DataType="{x:Type ViewModel:LoginViewModel}">
        <View:LoginView/>
    </DataTemplate>

Das Basismodel und ein Derivat davon

    public class BaseWorkspaceViewModel : WpfBase.BaseViewModel
    {
        public  BaseWorkspaceViewModel()
        {
            WindowId = Manager.GetNewWindowId();
        }

        public string DisplayName { get; set; }
        public int WindowId { get; private set; }
        private ICommand _closeCommand;
        public ICommand CloseCommand
        {
            get { return _closeCommand ?? (_closeCommand = new DelegateCommand(() => CloseRequest(this, new EventArgs()))); }
        }

        public event EventHandler<EventArgs> CloseRequest;
    }

    public class LoginViewModel:BaseWorkspaceViewModel
    {
        public LoginViewModel()
        {
            Username = Environment.UserName;
            _isLoading = false;
        }

        private bool _isLoading;
        public bool IsLoading
        {
            get { return _isLoading; }
            set { _isLoading = value;OnPropertyChanged(() => IsLoading); }
        }

        private string _username;
        public string Username
        {
            get { return _username; }
            set
            {
                _username = value;
                OnPropertyChanged(() => Username);
            }
        }

        private string _password;
        public string Password
        {
            get { return _password; }
            set { _password = value;OnPropertyChanged(() => Password); }
        }

        private string _message;
        public string Message
        {
            get { return _message;}
            set { _message = value;OnPropertyChanged(() => Message); }
        }

        private ICommand _loginCommand;
        public ICommand LoginCommand
        {
            get
            {
               return _loginCommand ?? (_loginCommand = new DelegateCommand(DoLogin));
                
            }
        }
        private void DoLogin()
        {
#if DEBUG
            Manager.IsLoggedIn = true;
            Manager.Repository.GetEmployeeCompleted += (s, e) => { Manager.CurrentUser = e.Result;
                                                                     IsLoading = false;
            Manager.RequestClose(this.WindowId);};
            Manager.Repository.GetEmployee(1);
            IsLoading = true;

            //CloseCommand.Execute(null);
#else

#endif

        }
    }

Und das MainView bzw. das Model.

   public class MainWindowViewModel:WpfBase.BaseViewModel
   {
       public MainWindowViewModel()
       {
           var loginView = new LoginViewModel();
           loginView.CloseRequest += (s, e) => Manager.ViewModels.Remove(loginView);
           loginView.DisplayName = "Login";
           Manager.ViewModels.Add(loginView);
       }

       private ObservableCollection<MainMenuItem> _menuItems; 
       public ObservableCollection<MainMenuItem> MenuItems { get { return _menuItems; } }

       public ObservableCollection<BaseWorkspaceViewModel> ViewModels { get { return Manager.ViewModels; } }

       protected void SetActiveWindowModel(BaseWorkspaceViewModel workspace)
       {
           ICollectionView collectionView = CollectionViewSource.GetDefaultView(Manager.ViewModels);
           if (collectionView != null)
               collectionView.MoveCurrentTo(workspace);
       }

    }

Der Konstruktor des BaseViewModels wird nun 2x augerufen : Einmal beim Konstruktor des MainWindowViewModels und dann beim Anzeigen der View...

Wat nu ?

2.298 Beiträge seit 2010
vor 12 Jahren

Das Verhalten ist doch völlig korrekt, schließlich erben beide ViewModels von der Basisklasse. Somit werden ja auch beide instantiiert.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 12 Jahren

Hi,
es geht um das BaseWorksapceViewModel und das Derivat LoginViewModel.

var loginView = new LoginViewModel();
           loginView.CloseRequest += (s, e) => Manager.ViewModels.Remove(loginView);
           loginView.DisplayName = "Login";
           Manager.ViewModels.Add(loginView);

Hier instanziere ich genau 1x das VM. Und trotzdem wird der Konstruktor 2x ausgeführt (von der Basis). Das der Konstruktor der Basis ausgeführt wird ist schon klar , nur nicht 2x ...

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 12 Jahren

Ach ich bin ein Hammel:

Das Control hatte ein DataContext gesetzt.
Dadurch wurde der Konstruktor 2x aufgerufen....
Doof,
Kann geclosed werden 😉