Ich bin ein wenig überrascht, dass es nicht möglich ist, eine Bindung für Canvas.Children über XAML einzurichten. Ich habe auf einen Code-behind-Ansatz zurückgreifen, die etwa wie folgt aussieht:Ist es möglich, die Canvas-Eigenschaft eines Canvas in XAML zu binden?
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);
}
Ich würde viel lieber nur eine Bindung in XAML wie folgt aufgebaut:
<Canvas x:Name="designerCanvas"
Children="{Binding Document.Items}"
Width="{Binding Document.Width}"
Height="{Binding Document.Height}">
</Canvas>
Gibt es eine Um dies zu erreichen, ohne auf einen Code-Behind-Ansatz zurückzugreifen? Ich habe etwas über das Thema gegoogelt, aber ich habe mir für dieses spezielle Problem nicht viel einfallen lassen.
Ich mag meinen derzeitigen Ansatz nicht, weil er mein schönes Model-View-ViewModel muckt, indem ich das View auf sein ViewModel aufmerksam mache.
Ist dies nicht Performance-Probleme haben, da Sie eine völlig neue Leinwand für jeden Punkt sind das Hinzufügen Sie zeichnen möchten? – Benjamin