Je suis un peu surpris qu'il ne soit pas possible de configurer une liaison pour Canvas.Children via XAML. J'ai dû recourir à une approche code-behind qui ressemble à ceci:Est-il possible de lier une propriété Canvas Children dans XAML?
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 simplement mettre en place une reliure en XAML comme ceci:
<Canvas x:Name="designerCanvas"
Children="{Binding Document.Items}"
Width="{Binding Document.Width}"
Height="{Binding Document.Height}">
</Canvas>
est-il un manière d'accomplir ceci sans recourir à une approche de code-behind? J'ai fait quelques recherches sur le sujet, mais je n'ai pas trouvé grand chose pour ce problème spécifique.
Je n'aime pas mon approche actuelle, car elle corrige ma belle Model-View-ViewModel en la rendant visible par ViewModel.
Est-ce pas ont des problèmes de performance, puisque vous ajoutez une toile entièrement nouvelle pour chaque point que vous voulez dessiner? – Benjamin