Caliburn Micro время разработки с использованием соглашений об именах
Использование Caliburn Micro 1.5.1 Я пытаюсь заставить привязки времени разработки работать в приложении WP8. Я создал ViewModel времени разработки, который я явно указываю в PhoneApplicationPage:
<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 (и модели представления времени разработки) есть открытое свойство с именем Rooms, которое я связываю с коллекцией ItemsSource, используя подход именованного соглашения. Однако этот подход не работает во время разработки, если я не добавлю свойство ItemsSource
<Grid x:Name="ContentPanel">
<telerikPrimitives:RadDataBoundListBox x:Name="Rooms" ItemsSource="{Binding Rooms}" ...>
Однако, когда я использую привязку ItemsSource, я теряю магию соединения CM, как SelectedItem. Есть ли способ заставить мои привязки работать во время разработки, используя подход соглашений об именах, не изменяя страницу чем-либо, кроме атрибутов времени разработки?
1 ответ
Хорошо, я понял это. То, что я искал, было способностью перезаписывать существующие привязки всегда. CM более защищен, и поэтому по умолчанию он не заменит существующие привязки или значения для ItemsControl. Это поведение определяется в 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;
};
То, что я сделал, чтобы заставить фреймворк всегда заменять привязку, было заменить вызов SetBindingWithoutBindingOrValueOverwrite
с прямым звонком SetBinding
в моем BootStrapper. Так:
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)
Я могу видеть, где кто-то может захотеть принудительно заменить существующую привязку в некоторых случаях. Возможно я напишу патч...