2010-02-23 10 views
10

내 WPF 애플리케이션에서 나는 캔버스를 사용하여 드로잉을합니다. 이전에 코드에서 드로잉을 처리했지만 지금은 ViewModel에 모든 요소를 ​​추가했습니다. 이것은 나에게 몇 가지 도전을 준다.WPF 캔버스를 ObservableCollection에 바인딩

나는 스트로크를 가지고있는 몇 개의 InkPresenter 객체를 가지고있다.

// Build an InkPresenter: 
var someInkPresenter = BuildInkPresenter(..); 
//_myCanvas is the <Canvas> I want to display it in: 
_myCanvas.Children.Add(someInkPresenter); 

을 지금 - 나는 다르게이 작업을 수행 할 필요가 _myCanvas을 보유하고있는 XAML의 코드 숨김에서 InkPresenter를 구축하지 :이 같은 - Earier 난 뒤에 코드에서 캔버스에 자녀로 추가. 내가 뭘하려는 것은 InkPresenter을 만들고 컬렉션에 추가하는 것입니다

public ObservableCollection<InkPresenter> Drawings; 

내 문제는 지금이 ObservableCollection에 캔버스를 바인딩하는 방법을 - 그리고 컬렉션에 추가 할 때 InkPresenters 표시합니다. 어떻게 든 데이터 바인딩을 사용하여 이것을 달성 할 수 있습니까?

답변

16

나는 이것을 ItemsControl + ItemsPanelTemplate으로 할 수 있다고 생각합니다. 이처럼 :

<ItemsControl ItemsSource="{Binding YourCollection}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Canvas /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    </ItemsControl> 

는이 방법에 대한 자세한 내용을 Dr.WPF를 참조하십시오 ItemsControl: A to Z (P is for Panel)

+0

Thx! 합리적으로 들린다. 그것을 봐 줄 것입니다! – stiank81

+1

이것은 일반적으로 사용자가 취하는 접근 방식이지만, InkPresenters가 코드에 추가 할 때처럼 캔버스의 직접 자식이 될 수 없으므로이 경우에는 문제가 발생할 가능성이 높습니다. 대신 Visual Tree에는 각 InkPresenter 항목 주위에 추가 ContentPresenter가 삽입됩니다. 이 메서드를 작동 시키려면 각 InkPresenter에서 실제 데이터 (Strokes)를 꺼내어 해당 컬렉션을 VM에 저장해야합니다. 그런 다음 GetContainerForItemOverride를 재정 의하여 InkPresenter를 반환하는 사용자 지정 ItemsControl을 만들 수 있습니다. –

+0

Cant가 John과 동의합니다 ... ItemsControl입니다. 그것은 기본 컨테이너로 UIElement를 사용합니다 ... – Anvaka

10

Anvaka 제안이 솔루션은 매우 중요하지만, 존 보웬 지적대로 좀 더 알 필요가 , 실제로 항목을 Canvas 첨부 속성에 바인딩하려는 경우. 여기

을 위해 Canvas.LEFT 및 Canvas.Top에 결합하는 방법에 대한 예입니다 : Btw는

<ItemsControl ItemsSource="{Binding YourCollection}"> 
<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Canvas /> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 
<ItemsControl.ItemContainerStyle> 
    <Style TargetType="ContentPresenter"> 
     <Setter Property="Canvas.Left" Value="{Binding YourModelLeft}" /> 
     <Setter Property="Canvas.Top" Value="{Binding YourModelTop}" /> 
    </Style> 
</ItemsControl.ItemContainerStyle> 

, 나는이 작동하지 않았다 바인딩 Anvaka의 제안을 시도 후, this question에 해결책을 발견 .

다른 사람들에게도 도움이 되었기를 바랍니다.

+0

고마워, 정확히 내가 무엇을 찾고 있었는지. – Cousken

관련 문제