使用ContentControl在WPF中显示视图不起作用

时间:2014-12-20 05:33:26

标签: c# wpf xaml mvvm navigation

我目前正在研究一个小项目,以便更好地学习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文件是由UserControlButtons组成的TextBlocksBindableObject只是我使用的一个抽象类,它实现了INotifyProperty接口。 ViewModelNavigationBase是我所有视图模型将继承的类;它暂时不包含任何内容。

如何解决此问题,以显示我的视图而不是关联的viewmodel的字符串表示形式?

2 个答案:

答案 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}">