【问题标题】:How to resolve "..dictionary entry must have associated key" error?如何解决“..dictionary entry must have associated key”错误?
【发布时间】:2015-11-29 15:18:27
【问题描述】:

我已在我的 App.xaml 文件中添加了一个命名空间,以解析我在项目中的 ViewModelLocator.cs 位置。然后从 ResourceDictionary 中引用了 ns。但是当我添加这些时我得到了两个错误:

..Each dictionary entry must have an associated key.

'ViewModelLocator' does not exist in XML namespace 'clr-namespace:MongoDBApp.ViewModels;assembly=MongoDBApp'

我首先检查了命名空间对于 ViewModelLocator 的位置是否正确,即:namespace MongoDBApp.ViewModels

我还检查了 ResourceDictionary 中引用的语法,这似乎是正确的。这个solution 没有解决错误,我已经清理并重建了几次解决方案。

谁能建议如何解决这个错误?

App.xml文件的定义如下,ResourceDictionary在文件底部附近:

<Application x:Class="MongoDBApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:converters="clr-namespace:MongoDBApp.Converters"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:MongoDBApp.ViewModels;assembly=MongoDBApp"
             xmlns:validators="clr-namespace:MongoDBApp.Validator"
             StartupUri="pack://application:,,,/Views/MainView.xaml"
             d1p1:Ignorable="d">
    <Application.Resources>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Validation.ErrorTemplate">
                <Setter.Value>
                    <ControlTemplate>
                        <DockPanel>
                            <Grid Width="16"
                                  Height="16"
                                  Margin="3 0 0 0"
                                  VerticalAlignment="Center"
                                  DockPanel.Dock="Right">
                                <Ellipse Width="16"
                                         Height="16"
                                         Fill="Red" />
                                <Ellipse Width="3"
                                         Height="8"
                                         Margin="0 2 0 0"
                                         HorizontalAlignment="Center"
                                         VerticalAlignment="Top"
                                         Fill="White" />
                                <Ellipse Width="2"
                                         Height="2"
                                         Margin="0 0 0 2"
                                         HorizontalAlignment="Center"
                                         VerticalAlignment="Bottom"
                                         Fill="White" />
                            </Grid>
                            <Border BorderBrush="Red"
                                    BorderThickness="2"
                                    CornerRadius="2">
                                <AdornedElementPlaceholder />
                            </Border>
                        </DockPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
                </Trigger>
            </Style.Triggers>
        </Style>
        <ResourceDictionary>
            <local:ViewModelLocator x:Key="mainViewModelLocator" ></local:ViewModelLocator>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Brown.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Brown.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>     
    </Application.Resources>
</Application>

【问题讨论】:

  • 您好,我不知道它是否对您有帮助,但过去我是这样做的。我创建了一个用户控件类,派生自 UserControl,然后在构造函数中设置 ViewModelLocator,然后我添加的每个 UserControl 都将使用我的基本 UserControl(因此它们都自动获得 VML)。如果您认为这可以解决您的问题,我可以编写一些伪代码来展示我是如何做到的。
  • 你能发布一些伪代码来展示这个解决方案吗?
  • ViewModelLocator 是公开的吗?您是否编译过它所在的程序集? (设计人员往往不会注意到尚未编译的内容)此外,在使用合并字典时,您只能在合并字典部分内执行操作,但您有两个可能导致错误的子项。在 Merged 字典中移动 local:ViewModelLocator 并查看错误是否消失。 (它将成为隐式 ResourceDictionary 子项的一部分,然后与其他字典声明合并)

标签: wpf c#-4.0 resourcedictionary app.xaml viewmodellocator


【解决方案1】:

这样的东西应该可以工作,请注意我的 ViewModelLocator 在这种情况下来自棱镜(这就是我需要 IView 的原因,如果你使用其他东西就不需要)。

基类

public class MyFormUserControl : UserControl, IView
{
    public MyFormUserControl()
    {
        if (!DesignerProperties.GetIsInDesignMode(this))
        {
            SetValue(ViewModelLocator.AutoWireViewModelProperty, true);
        }
    }
 }

用户控制

<controls:MyFormUserControl  x:Class="MyWpf1.UserControl1"
                         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                         xmlns:controls="path to the base class">

your usual xaml goes here

</controls:MyFormUserControl>

后面的代码

public partial class UserControl1: MyFormUserControl
{
    public CrateFormView() : base()
    {
        InitializeComponent();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2023-03-19
    • 2018-06-05
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多