2017-12-08 5 views
0

중첩 된 usercontrol을 가진 간단한 애플리케이션이 있습니다.사용자 정의 컨트롤에서의 Catel 동결

MainWindow.xaml : 명명 규칙의

<Grid x:Name="LayoutRoot"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <TextBox Grid.Row="0">Test TextBox</TextBox> 

    <userControls:SuggestUserControl Grid.Row="1" Grid.Column="0" 
     DataContext="{Binding CitizenshipViewModel}" />   
</Grid> 

위반이 UserControl을 후속 다시 사용할 이유입니다. 이 경우 내가 App.xaml.cs를 사용자 정의보기 모델을 등록하고 있습니다 :

var viewLocator = ServiceLocator.Default.ResolveType<IViewModelLocator>(); 
viewLocator.Register(typeof(SuggestUserControl), typeof(CitizenshipSuggestViewModel)); 

CitizenshipSuggestViewModel 빈 생성자와 간단한 클래스입니다, 몇 가지 추가 논리는 (내가 테스트 RESON에 주석 이십 기가 바이트) 및 기본 클래스 SuggestModule에서 파생 된 :

public class SuggestModule<TEntity> : ViewModelBase 
     where TEntity : class, ISuggestable, new() 
    { 
     #region Private fields 

     private readonly IDataBaseService _dataBaseService; 

     #endregion 


     #region Default constructor 

     public SuggestModule(IDataBaseService dataBaseService) 
     { 
      Argument.IsNotNull(() => dataBaseService); 
      _dataBaseService = dataBaseService; 

      //Loading data from context 
      var collection = _dataBaseService.LoadObservableCollectionOf<TEntity>(); 
      ItemsCollection = new ObservableCollection<TEntity>(collection); 
      ItemsCollection.Sort(); 
     } 

     #endregion 

     ...Some logic here... 
    } 

MainWindowViewModel는 : 응용 프로그램이 완전히로드 될 때

public class MainWindowViewModel : ViewModelBase 
     { 
      public MainWindowViewModel(Person person) 
      { 
       Argument.IsNotNull(()=>person); 

       Person = person; 
      } 

      [Model] 
      public Person Person 
      { 
       get => GetValue<Person>(PersonProperty); 
       set => SetValue(PersonProperty, value); 
      } 

      public static readonly PropertyData PersonProperty = 
       RegisterProperty<MainWindowViewModel, Person>(model => model.Person); 

      [ViewModelToModel("Person")] 
      public Citizenship Citizenship 
      { 
       get => GetValue<Citizenship>(CitizenshipProperty); 
       set => SetValue(CitizenshipProperty, value); 
      } 

      public static readonly PropertyData CitizenshipProperty = 
       RegisterProperty<MainWindowViewModel, Citizenship>(model => model.Citizenship); 

      public Citizenship Citizenship 
      { 
       get => GetValue<Citizenship>(CitizenshipProperty); 
       set => SetValue(CitizenshipProperty, value); 
      } 

      public static readonly PropertyData CitizenshipProperty = 
       RegisterProperty<MainWindowViewModel, Citizenship>(model => model.Citizenship); 

      public IViewModel CitizenshipViewModel 
      { 
       get => GetValue<IViewModel>(CitizenshipViewModelProperty); 
       set => SetValue(CitizenshipViewModelProperty, value); 
      } 

      public static readonly PropertyData CitizenshipViewModelProperty = 
       RegisterProperty<MainWindowViewModel, IViewModel>(model => model.CitizenshipViewModel); 

      protected override async Task InitializeAsync() 
      { 
       await base.InitializeAsync(); 

       CitizenshipViewModel = this.GetTypeFactory().CreateInstance<CitizenshipSuggestViewModel>(); 
      }  
     } 
    } 

그래서, SuggestModule에 특히 ItemsCollection 이미 가득 나는 약 5 ... 육초 동결이 중첩 된 UserControl을의 일부입니다 두 번째 텍스트 상자에 포커스를 얻는 경우, 지금

12:19:34:844 => [DEBUG] [Catel.MVVM.Views.ViewToViewModelMappingHelper] [1] Initializing view model container to manage ViewToViewModel mappings 
12:19:34:864 => [DEBUG] [Catel.MVVM.Views.ViewToViewModelMappingHelper] [1] Initializing view model 'CitizenshipSuggestViewModel' 
12:19:34:874 => [DEBUG] [Catel.MVVM.Views.ViewToViewModelMappingHelper] [1] Initialized view model 'CitizenshipSuggestViewModel' 
12:19:34:895 => [DEBUG] [Catel.MVVM.Views.ViewToViewModelMappingHelper] [1] Initialized view model container to manage ViewToViewModel mappings 

그러나 : 컨텍스트의 데이터로, 로그인 정보를 얻었다. 이번에 로깅 정보 :

12:23:21:212 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:21:387 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:21:809 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:21:901 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:22:016 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:22:063 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:22:221 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:22:235 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:22:585 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:22:654 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:22:703 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:23:019 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:23:319 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:23:431 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:24:105 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:24:566 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:24:644 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:25:803 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 
12:23:26:115 => [DEBUG] [Catel.IoC.TypeFactory] [1] Cleared type constructor cache 

이 동작을 어떻게 피할 수 있습니까? 미리 감사드립니다.

답변

1
  • 대신 데이터 Orc.EntityFramework6를 사용하여 검색

  • 대신 오래된 Catel.Extensions.EntityFramework6

의 생성자의 InitializeAsync를 사용하여 완전히 내 문제를 해결하고 있습니다.

0
  1. 우리는 VS 2017와 함께 당신이 Catel 5.2을 사용하고 데이터 검색
  2. 의 생성자 대신 InitializeAsync를 사용하는 것이 좋습니다? 디버거를 연결하지 않고 실행해도 문제가 계속 발생합니까?
+0

예, 5.2 catel, VS2017 및 debbuger가없는 경우는 ... – ArieSLV

+0

GitHub에서 repro & ticket을 만들 수 있습니까? 그럼 우리가 살펴볼거야! –

+0

repro에 대해서는 https://github.com/Catel/Catel/issues/1140을 참조하십시오. –