【发布时间】:2017-06-12 13:48:14
【问题描述】:
我是初学者,在设置 WPF 项目和遵循 MVVM 模式时遇到问题;我看不到如何将视图链接到具有以下组织的视图模型:
我设置了 3 个文件夹:Model、View 和 ViewModel,它们都位于名为“Company.App.UI”的项目的根目录中。 App.xaml 和 MainWindow.xaml 位于项目的根目录。
从这里开始,我想通过以下方式控制 MainWindow 客户区中显示的内容: - 将文件夹“View”中的渲染视图作为 UserControls,例如“LoginView.xaml” - 在“ViewModel”文件夹中有相应的视图模型,例如“LoginView.xaml.cs”
那么我在 MainWindow.xaml 中所做的是:
<Window x:Class="Company.App.UI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewmodel="clr-namespace:Company.App.UI.ViewModel"
xmlns:view="clr-namespace:Company.App.UI.View" <!-- does not work, not a namespace -->
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type viewmodel:LoginViewModel}">
<view:LoginView/> <!-- does not work -->
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal">
<ContentControl Content="{Binding ClientArea}"/>
</StackPanel>
</Grid>
</Window>
在 MainWindow.xaml.cs 中:
using System.Windows;
using System.Windows.Controls;
using Company.App.UI.ViewModel;
namespace Company.App.UI
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private UserControl _ClientArea = null;
public UserControl ClientArea
{
get { return _ClientArea; }
set { _ClientArea = value; }
}
public MainWindow()
{
if (_ClientArea == null) { ClientArea = new LoginViewModel(); }
InitializeComponent();
}
}
}
LoginView 是一个简单的用户控件,带有一个标签,只是为了看看它是什么。 如果我将我的 LoginView.xaml 放在项目的根目录下,在 MainWindow.xaml 旁边,它可以工作...... 我做错了什么/错过了什么? 我不想使用任何框架(PRISM 等)来让它工作。 如果我的帖子重复,我深表歉意,但我在搜索时也找不到它。 谢谢,
更新
我使用带有 0 个更新/补丁/等的 VS2013。 一切都在同一个项目中。
错误输出是:
- 类型或命名空间名称“视图”不存在于 命名空间“Company.App.UI”(您是否缺少程序集引用?)
- 名称空间中不存在名称“LoginView” “clr 命名空间:Company.App.UI.View”。
- 未找到类型“view:LoginView”。确认您没有丢失程序集引用,并且所有引用的程序集都已构建。
LoginView.xaml:
<UserControl x:Class="Company.App.UI.ViewModel.LoginViewModel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Label>User control login</Label>
</Grid>
</UserControl>
LoginViewModel.cs:
using System.Windows.Controls;
namespace Company.App.UI.ViewModel
{
public partial class LoginViewModel : UserControl
{
public LoginViewModel()
{
}
}
}
【问题讨论】:
-
文件夹结构不相关。您必须在代码文件中使用适当的命名空间声明,例如
namespace Company.App.UI.View { ... } -
“有效” - 什么无效?你想要to improve 工作代码吗?
-
ClientArea被声明为UserControl(非常糟糕的主意)。然后你分配一个名为LoginViewModel的东西给它。LoginViewModel是什么?它是视图模型还是控件? -
要绑定到窗口的属性而不是窗口的
DataContext的属性(您将其保留为空),请使用相对源/祖先类型绑定:Content="{Binding ClientArea, RelativeSource={RelativeSource AncestorType=Window}}" -
要记住的基本规则。你的 ViewModel 不能使用
System.Windows.Controls;命名空间。