2015-11-29 14 views
2

Я добавил пространство имен в свой файл App.xaml, чтобы разрешить местоположение ViewModelLocator.cs в проекте. Затем он ссылался на ns из ResourceDictionary. Но я получаю два иные ошибки, когда я добавить эти:Как разрешить «.. запись в записи должна иметь связанный ключ»?

..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> 
+0

Привет, я не знаю, будет ли это поможет, но в прошлом я сделал это. Я создал класс управления пользователя, полученный из UserControl, а затем в конструкторе, который я установил ViewModelLocator, тогда каждый добавленный UserControl будет использовать мой базовый UserControl (поэтому они все автоматически получают VML). Если это то, что, по вашему мнению, может решить вашу проблему, я могу написать некоторый псевдо-код, чтобы показать, как я это делаю. – adminSoftDK

+0

Не могли бы вы опубликовать некоторый псевдо-код, чтобы показать это решение? –

+1

Открыт ли ViewModelLocator? Вы собрали сборку, в которой она находится? (разработчик обычно не замечает вещи, которые еще не скомпилированы). Также, используя словари с объединенными словарями, вы можете делать только те вещи, которые находятся в разделе «Объединенные словари», но у вас есть двое детей, которые могут вызывать ошибку. Переместите локальный: ViewModelLocator внутри объединенных словарей и посмотрите, не исчезла ли ошибка. (Он станет частью неявного дочернего ресурса ResourceDictionary, который затем будет объединен с другими объявлениями в словаре) – Maverik

ответ

1

Что-то, как это должно работать, пожалуйста, обратите внимание мое ViewModelLocator в этом случае исходит от призмы (вот почему мне нужен IView, вы не делаете, если используете что-то другое).

Базовый класс

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

UserControl

<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(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^