2016-12-06 3 views
2

현재 Catel을 연구 중입니다.Catel PersonApplication 예제

Catel.Examples의 PersonApplication - 특히 PersonWindow.xaml : 디자인 타임 데이터가 Visual Studio Designer에 표시되지 않습니다.

PersonViewModel 코드에서 공용 속성이 주석 처리됩니다. 코드가 Fody를 사용하여 런타임에 Model 속성을 생성하기 때문입니다. 따라서 Visual Studio Designer에서 Designer에 디자인 타임 데이터를 표시하려면 Public Properties가 필요하다고 가정하고 공용 속성의 주석을 제거합니다. 그러나 DesignPersonViewModel의 디자인 타임 데이터는 디자이너에 표시되지 않습니다.

런타임에 응용 프로그램이 올바르게 실행됩니다. 건물에 XAML 또는 코드 내의 문제를 나타내는 메시지가 없습니다. 디자인 타임 데이터 컨텍스트를 선언하는 XAML 코드가 정확한지 :

d:DataContext="{d:DesignInstance ViewModels:DesignPersonViewModel, 
           IsDesignTimeCreatable=True}" 

디자인 타임 데이터가 디자이너에 표시되지 않는 이유에 대한 모든 설명은?

나는 비주얼 스튜디오를 사용하고하는 것은 2015 년

답변

1

는 그럼에도 불구하고 Catel의 프레임 워크 내 강력한 감사, 나는이 이상한 행동

을 목격 한 그 종속성 속성이 [모델] 장식 속성에 유선되지 않는 것 같다. 그러나이를 수정해야하지만 종속성 속성을 직접 설정하는 것이 좋습니다.

public PersonViewModel(Person person) // this approach works 
{ 
    // Person = person ?? new Person(); 
    // The following 2 lines provide DesignTime data 
    SetValue("FirstName", "Joe"); 
    SetValue("LastName", "Dalton"); 
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute); 
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute); 
} 

public PersonViewModel(Person person) // this approach does not work 
{ 
    // Person = person ?? new Person(); 
    Person = new Person() { FirstName = "Joe", LastName = "Dalton" }; 
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute); 
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute); 
} 
+1

아주 좋음 그게 효과가 있었어. Geert가 왜이 코드를 수정하지 않는지 궁금합니다. 정말로 Catel에 감동했다. 그러나, 그것은 꽤 강철의 학습 곡선입니다 - 능력을 감안할 때 여전히 가치가 있습니다. 감사합니다. Julio. –

1

두 번째 예제는보기 모델이 훨씬 더 많은 논리 (모델 매핑을보기위한 모델)를 호출해야합니다. 그 이유는 디자인 타임보기 모델이 디자인 타임에 모델 매핑을 자동으로 수행하기를 기대하기 때문입니다. 우리가 그것을 구현할 수는 있지만별로 의미가 없을 것입니다.

디자인 타임 뷰 모델은 디자이너 내부에 더미 데이터를 표시하기 위해 매우 가볍고 단순한 뷰 모델이어야합니다. 런타임시 완벽하게 기능하는 뷰 모델로 작동해서는 안되기 때문에 디자이너가 느려지고 예외가 발생할 경우 디자이너가 손상 될 수 있습니다.

내 머리 꼭대기에서 우리는 디자이너에서 실행 중인지 확인하고, 그렇다면 꽤 논리를 건너 뜁니다.

이렇게 보이는 것이지만 디자인 타임보기 모델은 간단하고 가볍기 때문에 의도적으로 버그입니다. 디자인 목적으로 아주 간단한 것을 만들고 ViewModelLocator에 추가 명명 규칙을 추가하는 것이 좋습니다. 예를 들어 :

if (CatelEnvironment.IsInDesignMode) 
{ 
    var viewModelLocator = ServiceLocator.Default.ResolveType<IViewModelLocator>(); 
    viewModelLocator.NamingConventions.Insert(0, "[UP].ViewModels.[VW]DesignTimeViewModel") 
} 

이 앱 디자인 모드에서 MyPersonDesignTimeViewModel를 선호 할 수 있지만, 응용 프로그램이 실행 중일 때 여전히 실제 뷰 모델을로드합니다.

뷰가 디자인 타임에 뷰 모델을 실제로 확인하려고하는 경우에만 작동하며, 디자인 타임을 사용하지 않으므로 머리 꼭대기에서 볼 수 없다는 점에 유의하십시오.