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

Eri*_*ric 26 wpf xaml code-behind mvvm

我正在使用带有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">
Run Code Online (Sandbox Code Playgroud)

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

  1. 删除MyClass上的"部分"类修饰符.
  2. 将类"UserControl"添加到其子类列表中.

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

我错过了什么吗?

谢谢!

埃里克

Eri*_*ric 33

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

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

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

埃里克

  • 好吧......我赞成这一点,因为它非常聪明,但有些东西在你的XAML文件中有这种CDATA代码感觉不对...就像其他人在类似话题中提出的那样,为什么我们要完全没有删除空代码隐藏文件的麻烦?他们没有麻烦,很难看到他们坐在那里.不过,我喜欢你的创造力:-) (3认同)
  • 这是一个非常光滑的解决方案. (2认同)
  • 我们在这里有一个规则,CDATA中唯一可以使用InitializeComponent()的构造函数.还有别的,它应该在代码背后. (2认同)

Sco*_*ock 14

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