我目前正在研究一个小项目,以便更好地学习WPF,而我问自己的一个问题是,如果我想遵循MVVM模式,不同视图之间的导航将如何工作。
我偶然发现了this question here answering my question,但遗憾的是它似乎没有用。它不是显示我的视图,而是仅显示关联视图模型的命名空间。所以,例如,我没有看到我的LoginView,而是看到一个带有" JollyFinance.ViewModels.LoginViewModel"的白色屏幕。写入。
这是我的MainWindow.xaml代码:
<Window.Resources>
<!-- Different pages -->
<DataTemplate x:Key="LoginView" DataType="vm:LoginViewModel">
<views:LoginView />
</DataTemplate>
</Window.Resources>
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
<Grid>
<ContentControl Content="{Binding CurrentViewModel}"/>
</Grid>
这是我的MainViewModel.cs:
public class MainViewModel : BindableObject
{
private ViewModelNavigationBase _currentViewModel;
public MainViewModel()
{
CurrentViewModel = new LoginViewModel();
}
public ViewModelNavigationBase CurrentViewModel
{
get { return _currentViewModel; }
set
{
if (_currentViewModel != value)
{
_currentViewModel = value;
RaisePropertyChanged();
}
}
}
}
我的LoginViewModel.cs文件:
public LoginViewModel()
{
LoginCommand = new RelayCommand(Login);
NavigateCommand = new RelayCommand(Login);
}
private void Login(object param)
{
Popup codePopup = new Popup();
TextBlock popupText = new TextBlock();
popupText.Text = "Test";
popupText.Background = Brushes.LightBlue;
popupText.Foreground = Brushes.Blue;
codePopup.Child = popupText;
}
public String Username { get; set; }
public String Password { get; set; }
public ICommand LoginCommand { get; set; }
}
我的LoginView.xaml文件是由UserControl
和Buttons
组成的TextBlocks
。 BindableObject
只是我使用的一个抽象类,它实现了INotifyProperty
接口。 ViewModelNavigationBase
是我所有视图模型将继承的类;它暂时不包含任何内容。
如何解决此问题,以显示我的视图而不是关联的viewmodel的字符串表示形式?
答案 0 :(得分:8)
WPF不支持使用string
作为类型标识符的隐式DataTemplates。
您需要使用x:Type
Markup Extension指定您的视图模型类型:
<DataTemplate DataType="{x:Type vm:LoginViewModel}">
<views:LoginView />
</DataTemplate>
答案 1 :(得分:8)
我终于找到了问题所在。出于某种原因,当您在DataTemplate上声明x:Key时,它使ContentControl内容显示为字符串。我删除了DataTemplate的x:Key,现在一切正常。我还必须应用nemesv的答案才能发挥作用。
之前:
<DataTemplate x:Key="LoginView" DataType="vm:LoginViewModel">
之后(解决问题):
<DataTemplate DataType="{x:Type vm:LoginViewModel}">