我目前正在独自完成一个小项目,以更好地学习WPF,我问自己的问题是,如果我想遵循MVVM模式,不同视图之间的导航将如何工作。
我偶然发现了这个问题回答了我的问题,但不幸的是它似乎不起作用。与其显示我的视图,只显示关联的ViewModel的名称空间。例如,我看到的是一个白色屏幕,上面写着“JollyFinance.ViewModels.LoginViewModel”,而不是看到我的LoginView。
下面是我的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。BindableObject只是我使用的一个实现INotifyProperty接口的抽象类。ViewModelNavigationBase是所有我的视图模型将继承的类;目前它不包含任何东西。
该如何解决这个问题,以便显示我的视图而不是关联视图模型的字符串表示?
<ContentControl Content="{Binding CurrentViewModel}"/>
和<DataTemplate DataType="vm:LoginViewModel">
是否在同一个文件中定义?您可以尝试显式指定DataTemplate吗?因此,请尝试更改您的<DataTemplate x:Key="login">
和内容控件:<ContentControl ContentTemplate="{StaticResource login}" ...
以查看模板是否从您的内容控件“可见”... - nemesv<ContentControl ContentTemplate="{StaticResource login}" Content="{Binding CurrentViewModel}"/>
我猜你尝试过:<ContentControl Content="{StaticResource login}"/>
这就是为什么你得到了“System.Windows.DataTemplate”的原因。除此之外,我无法在空项目中重现此问题。在那里,DataType="{x:Type vm:LoginViewModel}"
可以解决问题。 - nemesvContentTemplate="{StaticResource login}"
,您将失去动态替换CurrentViewModel
并使用不同视图的能力。因此,这还不是解决方案。在 WPF 中没有任何变化,因此链接的文章也应该有效,我的关于DataType="{x:Type vm:LoginViewModel}"
的答案也是如此... - nemesv<DataTemplate DataType="{x:Type vm:LoginViewModel}">
- nemesv