<vm:simpleviewmodel x:key =“viewModel”>在WPF中意味着什么?</vm:simpleviewmodel>

时间:2015-04-09 17:33:34

标签: wpf xaml mvvm

我是WPF和MVVM的新手,实际上是在一周前开始的,我正在尝试使用WPF和MVVM编写应用程序代码,同时编写一个示例,我遇到了以下语句<vm:SimpleViewModel x:Key="viewModel"/>和我我试图推理它。我明白了什么&#39; x:&#39;指的是,它是XAML文件中提到的默认XAML命名空间,我为自己的ViewModel类创建了一个名称空间,UI将与之交互,并且我已经为它提供了一个别名&#34; vm&#34; SimpleViewModel是我的应用程序的ViewModel,出于参考目的的语句是xmlns:vm="clr-namespace:MVVM_Tutorial"

我对语句<vm:SimpleViewModel x:Key="viewModel"/>的推理是,一个Window是一个XAML元素,并且有一个资源字典,它引用它来解析并引用某些元素,因此在它的资源字典中,在#34中定义; X:&#34;命名空间我们正在分配一个名为&#34; Key&#34;的变量。其值为&#34; vm:&#34;中定义的SimpleViewModel类;命名空间。只是想知道我的理由是否合适,或者是否有一些我想念的东西,并希望知道从这里继续进一步。

2 个答案:

答案 0 :(得分:5)

XAML只是描述对象图的标记。代码也是描述对象图的标记。我可以说这个

var window = new Window();
window.DataContext = new MyNamespace.MyViewModel();

或者我可以像这样编写完全相同的东西

<Window xmlns:blahblah="clr-namespace:Normal.Xmlns.Deleted.For.Brevity"
        xmlns:this="clr-namespace:MyNamespace">
    <Window.DataContext>
        <this:MyViewModel />
    <!-- snip -->

可以在代码中实例化的任何对象都可以在xaml 中使用。有一些限制(例如,没有参数的默认公共构造函数),但在大多数情况下这是正确的。 XAML只定义了一个在运行时反序列化的对象图。

由于xaml中可以引用任何类型,因此假设您可以将MyViewModel的实例移动到资源字典并通过StaticResource或DynamicResource引用它。请注意,您放入资源字典中的任何内容都必须有一个密钥,通过x:Key:

分配
<Window xmlns:blahblah="clr-namespace:Normal.Xmlns.Deleted.For.Brevity"
        xmlns:this="clr-namespace:MyNamespace"
        DataContext="{DynamicResource lolderp}">
    <Window.Resources>
        <this:MyViewModel x:Key="lolderp" />
    <!-- snip -->

XAML是XML的一个子集,它使用XML命名空间映射到当前或其他程序集中的代码名称空间。它是框架如何知道MyViewModel引用的对象。要了解详情,read this link on msdn

答案 1 :(得分:0)

我确信其他人可以提出更多澄清......

在xaml文件中,

的引用

“的xmlns:[东西] =” CLR名称空间:[yourProjectOrLibrary]”

由于您的代码隐藏可能是冗长的名称空间引用,并且您的解决方案可能由多个项目(例如不同的DLL)组成,因此在处理XAML时,它使用“xmlns”作为参考无论“yourProjectOrLibrary”是什么......在你的情况下,项目/类“MVVM_Tutorial”。

现在,“vm”。这只是xaml中的“别名”,所以只要它引用

xaml知道它的来源,以获得控制,属性,类型等的解析。

至于“x:Key”部分......不是正面的,但是当我第一次构建我的自定义主题时,也遇到了关于x:Key的混乱。我对此的解释被发现是x:Key就像一个私有引用,但是通过给出名称..x:Key =“viewModel”...在xaml文件中稍后可以使用这个“名称”。

稍后可以在xaml中引用此“密钥”...例如,

<ControlTemplate x:Key="CTButton" TargetType="{x:Type Button}" >
    <!-- Start border of button to have a rounded corners -->
</ControlTemplate>

然后在主题中,我可以引用这个“Key”...在我的情况下“CTButton”。因此,如果我希望多个控件使用/派生自相同的控件模板,我可以让它们引用它......

<someControl>
   <Style>
      <Setter Property="Template" Value="{StaticResource CTButton}" />
   </Style>
</someControl

同样,我没有得到关于所有xaml标记的所有内容,但希望能为你澄清这一点。