Je suis un peu surpris qu'il n'est pas possible de mettre en place une liaison pour la Toile.Les enfants par le biais de XAML. J'ai dû recourir à un code-behind approche qui ressemble à quelque chose comme ceci:
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
DesignerViewModel dvm = this.DataContext as DesignerViewModel;
dvm.Document.Items.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Items_CollectionChanged);
foreach (UIElement element in dvm.Document.Items)
designerCanvas.Children.Add(element);
}
private void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
ObservableCollection<UIElement> collection = sender as ObservableCollection<UIElement>;
foreach (UIElement element in collection)
if (!designerCanvas.Children.Contains(element))
designerCanvas.Children.Add(element);
List<UIElement> removeList = new List<UIElement>();
foreach (UIElement element in designerCanvas.Children)
if (!collection.Contains(element))
removeList.Add(element);
foreach (UIElement element in removeList)
designerCanvas.Children.Remove(element);
}
Je préfère juste mis en place une liaison en XAML comme ceci:
<Canvas x:Name="designerCanvas"
Children="{Binding Document.Items}"
Width="{Binding Document.Width}"
Height="{Binding Document.Height}">
</Canvas>
Est-il un moyen pour accomplir cela sans avoir recours à un code-behind approche? J'ai fait quelques recherches sur google sur le sujet, mais ne viens pas avec beaucoup pour ce problème spécifique.
Je n'aime pas mon approche actuelle, car il devient fou mon beau Modèle-Vue-Vuemodèle en faisant le point de Vue conscient du ViewModel.