La liaison WPF Toile Enfants à une ObservableCollection
Dans mon application WPF j'ai une Toile dans laquelle je fais un peu de dessin. Plus tôt, j'ai manipulé le dessin dans le code derrière, mais maintenant, j'ai factorisé tout un ViewModel. Cela me donne une certaine défis..
J'ai un peu de InkPresenter des objets ayant des Traits. Précédemment, j'ai ajouté des enfants à la Toile dans le code-behind, comme ceci:
//Build an InkPresenter:
var someInkPresenter = BuildInkPresenter(..);
//_myCanvas is the <Canvas> I want to display it in:
_myCanvas.Children.Add(someInkPresenter);
Maintenant - et non de la construction de la InkPresenter dans le code-behind de la XAML qui détient _myCanvas j'ai besoin de le faire de façon différente. Ce que je voudrais faire est de créer un InkPresenter et l'ajouter à une collection:
public ObservableCollection<InkPresenter> Drawings;
Mon problème maintenant est de savoir comment lier la Toile à ce ObservableCollection - et ont la InkPresenters affichés lorsqu'il est ajouté à la collection. Puis-je réaliser cela à l'aide de Liaisons de Données en quelque sorte?
OriginalL'auteur stiank81 | 2010-02-23
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pouvez le faire avec ItemsControl + ItemsPanelTemplate. Comme ceci:
Pour en savoir plus sur cette approche, reportez-vous à Dr WPF: ItemsControl: de A à Z (P est pour Panneau)
Normalement, c'est l'approche que vous souhaitez prendre, mais dans ce cas, vous êtes probablement confronté à des problèmes, car la InkPresenters ne sont pas va être les enfants directs de la Toile comme ils le sont lorsque vous les ajoutez dans le code. Au lieu de l'Arborescence Visuelle va avoir un supplémentaire ContentPresenter injecté autour de chaque InkPresenter élément. Pour obtenir cette méthode de travail, vous devriez regarder en tirant sur les données réelles (Avc) de chaque InkPresenter et de stocker une collection de celles de votre VM. Vous pouvez ensuite créer un ItemsControl qui remplace GetContainerForItemOverride de retour d'un InkPresenter.
Peux pas d'accord avec vous Jean... C'est un ItemsControl. Il utilise UIElement comme conteneur par défaut...
Anvaka - Pas. Il n'a pas. Si vous regardez ItemsControl Réflecteur ou Snoop une instance au moment de l'exécution, vous pouvez voir qu'il utilise une ContentPresenter (qui ne tirent de UIElement) que le conteneur par défaut. Même si c'est à l'aide d'une base de UIElement c'est encore la modification de la Toile visuelle de l'arbre de Stian d'origine.
John, j'ai essayé avant de poster désaccord :). InkPresenter est l'enfant direct d'une Toile. Si un UIElement est ajouté à la collection d'Éléments explicite ItemsControl instance (par opposition à une instance d'une classe dérivée comme ListBox), il deviendra un enfant direct du panneau objets. Si un non-UIElement est ajouté, il sera enveloppé dans un ContentPresenter. Consultez le tableau à la fin de ce post drwpf.com/blog/2008/03/25/itemscontrol-i-is-for-item-container.
OriginalL'auteur Anvaka
La solution Anvaka suggéré est grande, mais John Bowen a souligné vous avez besoin d'en savoir un peu plus, si vous souhaitez réellement lier vos articles sur la Toile des propriétés attachées.
Voici un exemple sur la façon de se lier à la Toile.Gauche et de la Toile.Haut:
Btw, j'ai trouvé la solution sur cette question, après j'ai essayé Anvaka de la suggestion, où la liaison n'a pas fonctionné.
J'espère que cela aide les autres, à la recherche de la même réponse.
OriginalL'auteur Kenneth_hj