新用户控件未显示



我有一个名为"LinqView"的UserControl,其中有带按钮的菜单。

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

我创建了名为"UsersModel"的新模型类和名为"ViewUsersUserControl"的新UserControl

但我不知道为什么不起作用。

下面是我的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>

林克视图.cs

private void MenuItem_VU(object sender, RoutedEventArgs e)
{
    DataContext = new 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" >             
        <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();
    }

我已经删除了数据模板上的密钥。

更新:简单工作样品,

主窗口.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
    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>

林克视图用户控件 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;
        }
    }
}

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

如果您只有一个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>

最新更新