每个Dictionary条目必须具有关联的键属性

Fun*_*nut 31 c# xaml dictionary mvvm

我正在使用C#和来自GalaSoft的MVVM-Light Toolkit编写Windows 8.1 App.

我只有以下代码:

<Application.Resources>
    <vm:ViewModelLocator x:Key="Locator" xmlns:vm="using:Scedule.ViewModel" />

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resource Dictionaries/StandardStyles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>      
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

出现错误"每个词典条目必须具有关联的键属性",并且只有在我删除时才会消失

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resource Dictionaries/StandardStyles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary> 
Run Code Online (Sandbox Code Playgroud)

要么

    <vm:ViewModelLocator x:Key="Locator" xmlns:vm="using:Scedule.ViewModel" />
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这里的问题是什么?

Kin*_*ing 52

注意,Application.Resources需要一个实例ResourceDictionary,所以你必须做这样的事情:

<Application.Resources>    
  <ResourceDictionary>
    <vm:ViewModelLocator x:Key="Locator" xmlns:vm="using:Scedule.ViewModel" />
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Resource Dictionaries/StandardStyles.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>      
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

所以它一点也不奇怪,它也不是一个bug.如果你希望你ResourceDictionary被视为一种资源,你当然必须提供一些Key吧,但是在这种情况下,你真的要分配的一个实例ResourceDictionary的Application.Resources

  • @RichardGriffiths在使用`MergedDictionaries`时,我们需要一个`ResourceDictionary`的显式声明(而不是使用隐式的 - 由场景后面的XAML解析器创建).所以在这种情况下,我们需要将***任何其他资源***放在显式声明的`ResourceDictionary`中.正如我所说的,应该将`Application.Resources`分配给`ResourceDictionary`的实例.但是在XAML代码中,有时你会看到`<Application.Resources>`中有***超过1个元素*** - 但实际上所有都将放在`ResourceDictionary`的隐式实例中. (3认同)
  • 这样可行!并且感谢您的解释 - 这是解决问题时最重要的部分.非常感谢你 :) (2认同)