2016-02-08 3 views
0

(Используется WPF, Catel, Telerik UI)Ошибка «Не удалось построить представление„View Name“с нагнетательных и пустой конструктор» в публикации проекта

Здравствуйте, проблема в следующем, когда я пытаюсь для компиляции проекта, когда программа запускается в определенных местах, появляется следующая ошибка: «Не удалось создать представление« UserView »как с инжекционным, так и с пустым конструктором».

В то же время, когда я запускаю программу в самой Visual Studio в режиме отладки или программа выпуска работает без ошибок.

В чем может быть проблема ???

Вот методы называют View, они одинаковы, но во втором случае ошибка вылетает:

private Command _showDashboardView; 
     public Command ShowDashboardView 
     { 
      get 
      { 
       return _showDashboardView ?? (_showDashboardView = new Command(() => 
       { 
        _pleaseWaitService.Show(); 
        CurrentViewModel = new DashboardViewModel(); 
        _pleaseWaitService.Hide(); 
       })); 
      } 
     } 
private Command _showUserView; 
     public Command ShowUserView 
     { 
      get 
      { 
       return _showUserView ?? (_showUserView = new Command(() => 
       { 
        _pleaseWaitService.Show(); 
        CurrentViewModel = new UserViewModel(); 
        _pleaseWaitService.Hide(); 
       })); 
      } 
     } 

UserViewModel:

public class UserViewModel : ViewModelBase 
    { 
     private readonly IUIVisualizerService _uiVisualizerService; 
     private readonly IMessageService _messageService; 
     private readonly IPleaseWaitService _pleaseWaitService; 

     public olympEntities context 
     { 
      get { return GetValue<olympEntities>(contextProperty); } 
      set { SetValue(contextProperty, value); } 
     } 
     public static readonly PropertyData contextProperty = RegisterProperty("context", typeof(olympEntities), null); 

     public UserViewModel() 
     { 
      context = new olympEntities(); 
      Users = new ObservableCollection<User>(context.Users.OrderByDescending(u => u.ID_User)); 

      AddUser = new TaskCommand(OnAddUserExecuteAsync); 
      EditUser = new TaskCommand(OnEditUserExecuteAsync); 
      RemoveUser = new TaskCommand(OnRemoveUserExecuteAsync); 

      AddTicket = new TaskCommand(OnAddTicketExecuteAsync); 
      EditTicket = new TaskCommand(OnEditTicketExecuteAsync, OnEditTicketCanExecute); 
      RemoveTicket = new TaskCommand(OnRemoveTicketExecuteAsync, OnEditTicketCanExecute); 

      var dependencyResolver = this.GetDependencyResolver(); 
      _uiVisualizerService = dependencyResolver.Resolve<IUIVisualizerService>(); 
      _messageService = dependencyResolver.Resolve<IMessageService>(); 
      _pleaseWaitService = dependencyResolver.Resolve<IPleaseWaitService>(); 
     } 

     public override string Title { get { return "CustomerViewModel"; } } 

ответ

0

Дизайнер пытается для вызова логики вашего конструктора. Используйте этот код в начале вашего Vm CTOR:

if (CatelEnvironment.IsInDesignMode) 
{ 
    return; 
} 

Свободный про наконечник: использовать инъекции зависимостей вместо разрешения служб внутри конструктора:

public UserViewModel(IUIVisualizerService uiVisualizerService, IMessageService messageService, IPleaseWaitService pleaseWaitService) 
{ 
    Argument.IsNotNull(() => uiVisualizerService); 
    Argument.IsNotNull(() => messageService); 
    Argument.IsNotNull(() => pleaseWaitService); 

    _uiVisualizerService = uiVisualizerService; 
    _messageService = messageService; 
    _pleaseWaitService = pleaseWaitService; 

    if (CatelEnvironment.IsInDesignMode) 
    { 
     return; 
    } 

    context = new olympEntities(); 
    Users = new ObservableCollection<User>(context.Users.OrderByDescending(u => u.ID_User)); 

    AddUser = new TaskCommand(OnAddUserExecuteAsync); 
    EditUser = new TaskCommand(OnEditUserExecuteAsync); 
    RemoveUser = new TaskCommand(OnRemoveUserExecuteAsync); 

    AddTicket = new TaskCommand(OnAddTicketExecuteAsync); 
    EditTicket = new TaskCommand(OnEditTicketExecuteAsync, OnEditTicketCanExecute); 
    RemoveTicket = new TaskCommand(OnRemoveTicketExecuteAsync, OnEditTicketCanExecute); 
} 
+0

Если вы добавите аргументы в конструктор UserViewModel, вызов будет выглядеть так: CurrentViewModel = новый UserViewModel (uiVisualizerService, messageService, pleaseWaitService); '?? – SaTuN

+0

Вы должны использовать IViewModelFactory для создания моделей представления. Еще лучше, пусть Catel автоматически разрешит их для вас. Если вы хотите показать окно, используйте это: uiVisualizerService.ShowDialogAsync (); –

+0

Нет, я использую UserControl и вставляет их в главное окно. и uiVisualizerService.ShowDialog Я использую при вызове windows yes. – SaTuN

0

Кажется, я нашел источник проблемы. После долгих испытаний я понял, что проблема заключается в разметке XAML, проблема в том, что я не просил имя элемента telerik: RadDataPager. Как только имя было установлено, ошибка исчезла.