Estoy un poco sorprendido de que no sea posible configurar un enlace para Canvas.Children a través de XAML. He tenido que recurrir a un enfoque de código subyacente que se ve algo como esto:¿Es posible enlazar una propiedad de Canvas's Children en 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);
}
Prefiero acaba de crear una unión en XAML como esto:
<Canvas x:Name="designerCanvas"
Children="{Binding Document.Items}"
Width="{Binding Document.Width}"
Height="{Binding Document.Height}">
</Canvas>
¿Existe una forma de lograr esto sin recurrir a un enfoque de código subyacente? He hecho algunas búsquedas en Google sobre el tema, pero no he encontrado mucho para este problema específico.
no me gusta mi enfoque actual porque mucks mi buen Model-View-ViewModel al hacer la vista consciente de que es modelo de vista.
¿Esto no tiene problemas de rendimiento, ya que se va a añadir una nueva tela para cada punto que desea dibujar? – Benjamin