1

Использование Caliburn Micro 1.5.1 Я пытаюсь получить привязки времени проектирования для работы в приложении WP8. Я создал время разработки ViewModel, который я явно указать в PhoneApplicationPage:Caliburn Micro время разработки с использованием соглашений об именах

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

страница действительно не более чем RadDataBoundListBox от Telerik:

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

Как вы можете видеть, мой ViewModel (и модель времени просмотра проекта) имеют общедоступное свойство «Комнаты, которые я привязываю к коллекции ItemsSource, используя подход с именованным соглашением». Подход не работает во время разработки, однако, если я не добавить свойство ItemsSource

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

Однако, когда я использую ItemsSource связывания я теряю провод вверх магии CM как SelectedItem. Есть ли способ заставить мои привязки работать во время разработки, используя подход соглашений об именах, не изменяя страницу ничем иным, кроме атрибутов времени разработки?

ответ

2

Хорошо, я понял. Я искал возможность перезаписывать существующие привязки в любое время. CM более защищен, чем тот, и поэтому по умолчанию он не заменит существующие привязки или значения для элемента ItemsControl. Такое поведение определяется в ConventionManager.cs Thusly:

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

Что я сделал, чтобы заставить рамки всегда заменить связывание было заменить вызов SetBindingWithoutBindingOrValueOverwrite с прямым вызовом SetBinding в моем загрузчике. Итак:

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)

я могу увидеть, где кто-то может понадобиться декларативно заставить заменить существующую привязку в некоторых случаях. Возможно, я напишу патч ...

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