Я борюсь в течение одной недели с моей проблемой, и я не могу решить ее.Я программирую приложение 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
меняется.
Спасибо вам всем.Ура, Пол.