NotifyPropertyChanged и ContentControl - PullRequest
       1

NotifyPropertyChanged и ContentControl

0 голосов
/ 10 сентября 2018

Я борюсь в течение одной недели с моей проблемой, и я не могу решить ее.Я программирую приложение MVVM WPF, которое имеет одно окно (MainView).В этом Mainview я хочу загрузить разные UserControl, когда они мне нужны.В Application-Startup я загружаю MainViewModel.В Конструкторе MainViewModel я загружаю Первый ViewModel (LoginViewModel).Потому что мой MainView.xaml показывает мне мой Login-User-Control, как я хочу.Так что до этого момента все в порядке.В ActivePanel-class я сохраняю CurrentView, потому что в моем MainView.xaml я делаю привязку к своему CurrentView для ContentControl.Так что все работает, кроме смены представлений, хотя мой NotifyPropertyChanged метод CurrentView работает.Я думаю, что моя ошибка в xaml (DataBinding).Надеюсь, вы, ребята, можете мне помочь.

Это мой MainView.xaml, в котором я хочу загрузить различные шаблоны данных.Как я уже говорил: загрузка LoginViewModel через конструктор MainViewModel работает.Переключение на другие VieModels также работает, но связывание данных с ContentControl является большой проблемой.

<Window x:Class="App.View.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:App.View"
        mc:Ignorable="d"
        xmlns:viewmodels="clr-namespace:App.ViewModels"
        xmlns:views="clr-namespace:App.View"
        xmlns:helper="clr-namespace:App.Helper"
        Title="Betrooms" Height="500" Width="350">

    <Window.Resources>
        <DataTemplate x:Name="LoginUCTemplate" DataType="{x:Type viewmodels:LoginViewModel}">
            <views:LoginUC DataContext="{Binding}"/>
        </DataTemplate>

        <DataTemplate x:Name="RegUCTemplate" DataType="{x:Type viewmodels:RegViewModel}">
            <views:RegUC DataContext="{Binding}"/>
        </DataTemplate>

        <DataTemplate x:Name="HomeUCTemplate" DataType="{x:Type viewmodels:HomeViewModel}">
            <views:HomeUC DataContext="{Binding}"/>
        </DataTemplate>
    </Window.Resources>

    <Window.DataContext>
        <viewmodels:ActivePanel/>
    </Window.DataContext>

    <Grid>
        <ContentControl Content="{Binding CurrentView, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>
    </Grid>
</Window>

Это класс моего ActivePanel, где я сохраняю информациюо котором ViewModel является активным.CurrentView - это свойство, к которому я привязываю Контент-контроль.

namespace APP.ViewModels
{
    public class ActivePanel : NotifyPropertyChanged
    {
        private object _currentView;

        public object CurrentView
        {
            get { return _currentView; }
            set
            {
                if (value != _currentView)
                {
                    _currentView = value;
                    OnPropertyChanged("CurrentView");
                }
            }
        }
    }
}

Это мой MainViewModel:

namespace App.ViewModels
{
    public class MainViewModel : ActivePanel
    {
        private LoginViewModel _loginViewModel;

        public MainViewModel()
        {
            _loginViewModel = new LoginViewModel();
            CurrentView = _loginViewModel;
        }
    }
}

И это мой LoginViewModel, где я нахожусьизменив значение CurrentView с помощью действия:

namespace App.ViewModels
{
    public class LoginViewModel : ActivePanel
    {
        #region Member
        private string _username;
        private string _password;
        bool login = false;

        private HomeViewModel _homeViewModel;
        private RegViewModel _regViewModel;

        UserModel User = new UserModel();
        #endregion

        #region Properties
        public ICommand RegActionCommand { get; set; }
        public ICommand LogActionCommand { get; set; }

        public string GetUsername
        {
            get { return _username; }
            set
            {
                if (value != _username)
                {
                    _username = value;
                    OnPropertyChanged("GetUsername");
                }
            }
        }

        public string GetPassword
        {
            get { return _password; }
            set
            {
                if (value != _password)
                {
                    _password = value;
                    OnPropertyChanged("GetPassword");
                }
            }
        }
        #endregion

        #region Constructor
        public LoginViewModel()
        {
            this.RegActionCommand = new RelayCommand(RegAction);
            this.LogActionCommand = new RelayCommand(LogAction);
        }
        #endregion

        #region Button-Action
        private void LogAction(object obj)
        {               
                _homeViewModel = new HomeViewModel();
                CurrentView = _homeViewModel;
        }

        private void RegAction(object obj)
        {
            _regViewModel = new RegViewModel();
            CurrentView = _regViewModel;
        }
        #endregion           
    }
}

Надеюсь, мой вопрос понятен: привязка ContenControl установлена ​​в CurrentView, но ContentControl никогда не меняется, хотя свойствоCurrentView меняется.

Спасибо вам всем.Ура, Пол.

1 Ответ

0 голосов
/ 11 сентября 2018

В вашем обработчике команд вы изменяете свойство CurrentView вашего LoginViewModel.ContentControl DataContext - это MainViewModel, поэтому его содержимое привязано к свойству CurrentView MainViewModel.

. Вам необходимо установить свойство MainViewModel.в вашем командном обработчике.Есть разные способы достижения этого, например, вы можете добавить параметр конструктора в LoginViewModel, чтобы передать ссылку на MainViewModel.Вы можете сохранить эту ссылку, а затем получить к ней доступ в своем обработчике команд.

Другая возможность - вызвать событие или отправить сообщение от команды в вашем LoginViewModel и обработать его в MainViewModel.Это уменьшит связь между вашими ViewModels, но в зависимости от того, какой механизм и библиотеку вы используете, это может быть немного сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...