1

Caliburn Micro 1.5.1을 사용하면 디자인 타임 바인딩을 사용하여 WP8 앱에서 작동합니다.명명 규칙을 사용하는 Caliburn Micro 디자인 시간

<phone:PhoneApplicationPage 
    d:DataContext="{Binding Source={d:DesignInstance Type=designTime:StartPageDesignTimeViewModel, IsDesignTimeCreatable=True}}" 
    micro:Bind.AtDesignTime="True" 

페이지입니다 Telerik에서 정말 더 더 이상 RadDataBoundListBox :

<Grid x:Name="ContentPanel"> 
    <telerikPrimitives:RadDataBoundListBox x:Name="Rooms" ...> 

당신이 볼 수 있듯이, 내 뷰 모델 (그리고 나는 내가하여 PhoneApplicationPage에 명시 적으로 지정 디자인 타임 뷰 모델을 만들었습니다 디자인 타임 뷰 모델)에는 Rooms이라는 이름의 공용 속성이 있으며 명명 된 컨벤션 접근 방식을 사용하여 ItemsSource 컬렉션에 바인딩합니다. 나는 그러나 ItemsSource 속성

<Grid x:Name="ContentPanel"> 
    <telerikPrimitives:RadDataBoundListBox x:Name="Rooms" ItemsSource="{Binding Rooms}" ...> 

을 추가하지 않는 한 접근 방식은 내가 바인딩 ItemsSource를 사용할 때 나는 selectedItem가 같은 CM 와이어 업 마법을 잃고, 그러나 디자인 타임에 작동하지 않습니다. 디자인 타임 속성 이외의 다른 페이지를 수정하지 않고 명명 규칙 방식을 사용하여 디자인 타임에 제 바인딩을 가져 오는 방법이 있습니까?

답변

2

좋아, 알아 냈어. 내가 찾고 있던 것은 기존의 바인딩을 항상 덮어 쓸 수있는 능력이었다. CM은 그보다 방어 적이기 때문에 기본적으로 ItemsControl의 기존 바인딩이나 값을 대체하지 않습니다. 이 동작은 thusly 히 ConventionManager.cs에 정의되어있다 : 나는 프레임 워크를 강제로 무슨 짓을

AddElementConvention<ItemsControl>(ItemsControl.ItemsSourceProperty, "DataContext", "Loaded") 
.ApplyBinding = (viewModelType, path, property, element, convention) => { 
    if (!SetBindingWithoutBindingOrValueOverwrite(viewModelType, path, property, element, convention, ItemsControl.ItemsSourceProperty)) { 
     return false; 
    } 

    ApplyItemTemplate((ItemsControl)element, property); 

    return true; 
}; 

항상 나의 부트 스트 래퍼에 SetBinding 직접 호출 SetBindingWithoutBindingOrValueOverwrite에 전화를 대체하는 것이었다 바인딩을 교체 할 수 있습니다. 그래서 :

ConventionManager.AddElementConvention<ItemsControl>(ItemsControl.ItemsSourceProperty, "DataContext", "Loaded") 
      .ApplyBinding = (viewModelType, path, property, element, convention) => { 
           ConventionManager.SetBinding(viewModelType, path, property, element, convention, ItemsControl.ItemsSourceProperty); 

           ConventionManager.ApplyItemTemplate((ItemsControl) element, property); 
           return true; 
          }; 

사람이 선언적 어떤 경우에는 기존의 바인딩을 대체 강제 할 수있는 곳

내가 볼 수있다 (나는 또한 RadDataBoundListBox 위해 앞서 추가 한 협약이 편집했습니다). 아마 패치를 쓸거야 ...