1

Utilisation de Caliburn Micro 1.5.1 J'essaie d'obtenir des liaisons de temps de conception pour fonctionner dans une application WP8. J'ai créé un temps de conception ViewModel que je précise explicitement dans le PhoneApplicationPage:Temps de conception de Caliburn Micro en utilisant des conventions de nommage

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

La page est vraiment pas plus d'un RadDataBoundListBox de Telerik:

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

Comme vous pouvez le voir, mon ViewModel (et model time view model) possède une propriété publique nommée Rooms que je lie à la collection ItemsSource en utilisant l'approche conventionnelle nommée. L'approche ne fonctionne pas au moment de la conception, cependant, à moins que j'ajouter la propriété ItemsSource

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

Cependant, quand je l'utilise ItemsSource liant je perds le fil-up CM magique comme SelectedItem. Existe-t-il un moyen de faire fonctionner mes liaisons au moment de la conception en utilisant l'approche des conventions de dénomination sans modifier la page avec autre chose que des attributs de conception?

Répondre

2

Ok, je l'ai compris. Ce que je cherchais, c'était la capacité d'écraser les liaisons existantes en tout temps. CM est plus défensif que cela, et par conséquent, il ne remplacera pas les liaisons existantes ou les valeurs pour un ItemsControl. Ce comportement est défini dans 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; 
}; 

Ce que je l'ai fait pour forcer le cadre à remplacer toujours la liaison était de remplacer l'appel à SetBindingWithoutBindingOrValueOverwrite par un appel direct à SetBinding dans mon BootStrapper. Alors:

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

(je devais aussi faire de cette édition à la convention que j'avais ajouté plus tôt pour RadDataBoundListBox)

je peux voir où quelqu'un pourrait vouloir forcer déclarative remplacer une liaison existante dans certains cas. Peut-être que je vais écrire un patch ...