W mojej aplikacji WPF mam Canvas, w którym robię trochę rysunku. Wcześniej zajmowałem się rysunkiem w kodzie, ale teraz wszystko zapisałem na ViewModelu. To daje mi pewne wyzwania ..Wiązanie płótna WPF Canvas Children to an ObservableCollection
Mam kilka obiektów InkPresenter zawierających obrysy. Earier dodałem je jako dzieci na płótnie w kodzie tyłu - tak:
// Build an InkPresenter:
var someInkPresenter = BuildInkPresenter(..);
//_myCanvas is the <Canvas> I want to display it in:
_myCanvas.Children.Add(someInkPresenter);
Teraz - nie budować InkPresenter w kodzie opóźnieniem w XAML, który przechowuje _myCanvas muszę to zrobić inaczej. Co chciałbym zrobić, to stworzyć InkPresenter i dodać go do kolekcji:
public ObservableCollection<InkPresenter> Drawings;
Mój problem jest teraz jak związać płótna do tego ObservableCollection - i mają InkPresenters wyświetlany po dodaniu do kolekcji. Czy mogę to w jakiś sposób osiągnąć za pomocą Wiązania Danych?
Thx! Brzmi rozsądnie. Rzuć okiem na to! – stiank81
To jest zwykle podejście, które podejmiesz, ale w tym przypadku prawdopodobnie będziesz mieć problemy, ponieważ InkPresenters nie będą bezpośrednimi dziećmi Canvas, tak jak to jest kiedy dodajesz je w kodzie. Zamiast tego Visual Tree będzie miało dodatkowy ContentPresenter wstrzykiwany wokół każdego elementu InkPresenter. Aby ta metoda działała, powinieneś przyjrzeć się wyciągnięciu rzeczywistych danych (obrysów) z każdego InkPresenter i przechowywaniu kolekcji tych w twojej maszynie wirtualnej. Następnie można utworzyć niestandardowy ItemsControl, który zastępuje GetContainerForItemOverride, aby zwrócić InkPresenter. –
Nie mogę się z tobą zgodzić John ... To ItemControl. Wykorzystuje UIElement jako domyślny kontener ... – Anvaka