没有.xaml.cs代码的XAML文件

时间:2009-12-03 17:46:32

标签: wpf xaml mvvm code-behind

我正在使用带有Model-View-ViewModel模式的WPF。因此,我的代码隐藏文件(.xaml.cs)都是空的,除了调用InitializeComponent的构造函数。因此,对于每个.xaml文件,我都有一个匹配的,无用的.xaml.cs文件。

我发誓我在某处读到如果文件后面的代码是空的,除了构造函数,有一种方法可以完全从项目中删除该文件。搜索网后,似乎这样做的恰当方法是使用'x:Subclass'属性:

<UserControl
    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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    x:Class="MyNamespace.MyClass"
    x:Subclass="UserControl"
    d:DesignWidth="700" d:DesignHeight="500">

这在生成的.g.cs文件中执行以下操作:

  1. 删除MyClass上的“部分”类修饰符。
  2. 将“UserControl”类添加到其子类列表中。
  3. 似乎很完美。实际上,如果你在构建中仍然有.xaml.cs文件,它会因为缺少部分而不再编译 - 所以我认为这必须是正确的。但是,如果我从构建中删除多余的文件并运行,则控件不会正确初始化(它是空白的)。我认为这是因为没有调用InitializeComponent()。我看到InitializeComponent不是虚拟的,所以基类似乎没有办法调用它(没有使用反射)。

    我错过了什么吗?

    谢谢!

    埃里克

5 个答案:

答案 0 :(得分:32)

作为另一种选择,如果您不想一直使用DataTemplates,这里是UserControls的替代方法:

使用x:Code属性在XAML中嵌入构造函数调用:

<x:Code><![CDATA[ public MyClass() { InitializeComponent(); }]]></x:Code>

埃里克

答案 1 :(得分:13)

如果您关注Josh Smith's MVVM article,他会使用DataTemplates for Views而不是用户控件。如果将DataTemplates放入ResourceDictionaries,它们根本就没有代码隐藏。如果您没有使用用户控件的代码隐藏,这是否意味着您可以使用DataTemplate方法?如果您这样做,WPF将负责将您的View绑定到ViewModel。

答案 2 :(得分:2)

我与PDC的Windows客户端团队成员就此进行了讨论,现在,他被告知没有官方支持的方法可以完全消除文件背后的代码。正如您所看到的,您可以将其编译,但永远不会调用InitializeComponent(),因此控件无法正确设置。

x:Subclass attribute“用法主要用于不支持分部类声明的语言。”它不是为了允许这种行为(不幸的是)。

答案 3 :(得分:1)

如果您使用的是caliburn micro,则可以有效地删除.xaml.cs,该框架负责初始化(即,如果您采用视图模型方法)。

讨论https://caliburnmicro.codeplex.com/discussions/444250

答案 4 :(得分:0)

出于纯粹的好奇心,您是否尝试过使用此功能:

x:Subclass="Control"

默认情况下,UserControls需要InitializeComponent()调用,但事实上的标准控件不需要。我很想知道这是否有效。

-Doug