Sono un po 'sorpreso dal fatto che non sia possibile impostare un'associazione per Canvas.Children tramite XAML. Ho dovuto ricorrere a un approccio code-behind che sembra qualcosa di simile:E 'possibile associare la proprietà Children di una Canvas in 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);
}
Preferirei mille volte appena istituito un binding in XAML come questo:
<Canvas x:Name="designerCanvas"
Children="{Binding Document.Items}"
Width="{Binding Document.Width}"
Height="{Binding Document.Height}">
</Canvas>
C'è un modo di realizzare questo senza ricorrere ad un approccio code-behind? Ho fatto alcuni googling sull'argomento, ma non ho escogitato molto per questo specifico problema.
Non mi piace il mio approccio attuale perché strappa il mio bel Model-View-ViewModel rendendo View consapevole del suo ViewModel.
Questo non hanno problemi di prestazioni, dal momento che si sta aggiungendo una completamente nuova tela per ogni punto che si vuole disegnare? – Benjamin