新的UserControl没有显示出来

时间:2017-03-24 10:23:36

标签: c# wpf xaml mvvm user-controls

UserControl打电话给#34; LinqView"我有菜单的按钮。

用户点击按钮后,我想使用MVVM显示新的UserControl

我创建了一个名为" UsersModel"的新模型类。新的UserControl名为" ViewUsersUserControl"。

但我不知道为什么不工作。

以下是我的xaml& cs代码。

LinqView.xaml

<UserControl x:Class="LayoutMVVM.Views.LinqView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:LayoutMVVM.Views"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"

             xmlns:veiwmodels="clr-namespace:LayoutMVVM.ViewModels.MojeDBModel"
             xmlns:views="clr-namespace:LayoutMVVM.Views.MojeDBViews" >             

    <UserControl.Resources>
        <DataTemplate x:Name="UsersTemp" DataType="{x:Type veiwmodels:UsersModel}">
            <views:ViewUsersUserControl DataContext="{Binding}" />
        </DataTemplate>
    </UserControl.Resources>

    <Grid Background="LemonChiffon">

        <Menu Height="32" Name="Menu" VerticalAlignment="Top">
            <MenuItem Header="_Menu">
                <MenuItem Header="Add User" Click="MenuItem_VU" />
            </MenuItem>
        </Menu>

    </Grid>
</UserControl>

LinqView.cs

private void MenuItem_VU(object sender, RoutedEventArgs e)
{
    DataContext = new UsersModel();
}

2 个答案:

答案 0 :(得分:1)

这样试过?

 <UserControl x:Class="LayoutMVVM.Views.LinqView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:LayoutMVVM.Views"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300"

                 xmlns:veiwmodels="clr-namespace:LayoutMVVM.ViewModels.MojeDBModel"
                 xmlns:views="clr-namespace:LayoutMVVM.Views.MojeDBViews" >             

        <UserControl.Resources>
            <DataTemplate DataType="{x:Type veiwmodels:UsersModel}">
                <views:ViewUsersUserControl DataContext="{Binding}" />
            </DataTemplate>
        </UserControl.Resources>

        <Grid Background="LemonChiffon">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Menu " Height="32" Name="Menu" VerticalAlignment="Top">
                <MenuItem Header="_Menu">
                    <MenuItem Header="Add User" Click="MenuItem_VU" />
                </MenuItem>
            </Menu>
           <ContentControl Grid.Row="1" Content="{Binding UsersModel}"/>
        </Grid>
    </UserControl>

你的C#类应该是,

public class MainViewModel
{
 public UsersModel UsersModel {get;set;}
 // other properties
}

并点击菜单

   private void MenuItem_VU(object sender, RoutedEventArgs e)
    {
        DataContext = new MainViewModel();
    }

我删除了DataTemplate上的密钥。

<强>更新 简单的工作样本,

MainWindow.cs

namespace WpfApplication29
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainViewModel();
        }
    }

    public class MainViewModel : INotifyPropertyChanged
    {
        public LinqViewModel LinqModel
        {
            get; set;
        } = new LinqViewModel();

        public MainViewModel()
        {
            SelectedMainModel = LinqModel;
        }
        private object selectedModel;
        public object SelectedMainModel
        {
            get
            {
                return selectedModel;
            }
            set
            {
                selectedModel = value;
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void Notify(string name)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }

    public class LinqViewModel : INotifyPropertyChanged
    {
        public UserModel UserModel
        {
            get; set;
        } = new UserModel();

        private object selectedChildModel;
        public object SelectedChildModel
        {
            get
            {
                return selectedChildModel;
            }
            set
            {
                selectedChildModel = value;
                Notify("SelectedChildModel");
            }

        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void Notify(string name)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }

    public class UserModel
    {

    }
}

MainWindow.xaml

<Window
    x:Class="WpfApplication29.MainWindow"
    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:local="clr-namespace:WpfApplication29"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="525"
    Height="350"
    mc:Ignorable="d">
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:LinqViewModel}">
            <local:LinqView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:UserModel}">
            <local:UserView />
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ContentControl Content="{Binding SelectedMainModel}" />
    </Grid>
</Window>

用户UserControl

<UserControl
    x:Class="WpfApplication29.UserView"
    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:local="clr-namespace:WpfApplication29"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    d:DesignHeight="300"
    d:DesignWidth="300"
    mc:Ignorable="d">
    <Grid >
        <TextBlock Text="From UserView"/>
    </Grid>
</UserControl>

LinqView Usercontrol xaml

<UserControl
    x:Class="WpfApplication29.LinqView"
    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:local="clr-namespace:WpfApplication29"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    d:DesignHeight="300"
    d:DesignWidth="300"
    mc:Ignorable="d">
    <Grid Background="LemonChiffon">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Menu  Height="32" Name="Menu" VerticalAlignment="Top">
            <MenuItem Header="_Menu">
                <MenuItem Header="Add User" Click="MenuItem_VU" />
            </MenuItem>
        </Menu>
        <ContentControl Grid.Row="1" Content="{Binding SelectedChildModel}"/>
    </Grid>
</UserControl>

Linqview usercontrol cs

namespace WpfApplication29
{
    /// <summary>
    /// Interaction logic for LinqView.xaml
    /// </summary>
    public partial class LinqView : UserControl
    {
        public LinqView()
        {
            InitializeComponent();
        }

        private void MenuItem_VU(object sender, RoutedEventArgs e)
        {
            (this.DataContext as LinqViewModel).SelectedChildModel = (this.DataContext as LinqViewModel).UserModel;
        }
    }
}

此示例遵循多级层次结构。希望这有帮助。

答案 1 :(得分:0)

如果您只有一个UsersModel,则不需要将其作为资源模板:

<UserControl x:Class="LayoutMVVM.Views.LinqView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:LayoutMVVM.Views"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             xmlns:veiwmodels="clr-namespace:LayoutMVVM.ViewModels.MojeDBModel"
             xmlns:views="clr-namespace:LayoutMVVM.Views.MojeDBViews" >             
    <DockPanel Background="LemonChiffon">
        <Menu Height="32" Name="Menu" DockPanel.Dock="Top">
            <MenuItem Header="_Menu">
                <MenuItem Header="Add User" />
            </MenuItem>
        </Menu>
        <views:ViewUsersUserControl />
    </DockPanel>
</UserControl>