Привязка дочерних элементов WPF к ObservableCollection - PullRequest
12 голосов
/ 23 февраля 2010

В моем приложении WPF у меня есть холст, в котором я рисую. Ранее я занимался рисованием в коде позади, но теперь я все учел в ViewModel. Это дает мне некоторые проблемы ..

У меня есть несколько объектов InkPresenter, содержащих Strokes. Раньше я добавлял их как детей в Canvas в коде позади - вот так:

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

Теперь - не собирая InkPresenter в коде XAML, который содержит _myCanvas, мне нужно сделать это по-другому. Я хотел бы создать InkPresenter и добавить его в коллекцию:

public ObservableCollection<InkPresenter> Drawings;

Моя проблема сейчас заключается в том, как связать Canvas с этой коллекцией ObservableCollection и отображать InkPresenters при добавлении в коллекцию. Можно ли как-то добиться этого, используя привязки данных?

Ответы [ 2 ]

18 голосов
/ 23 февраля 2010

Я думаю, вы можете сделать это с помощью ItemsControl + ItemsPanelTemplate . Как это:

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

Чтобы узнать больше об этом подходе, обратитесь к Dr.WPF: ItemsControl: от A до Z ( P для Panel )

14 голосов
/ 13 апреля 2013

Решение, предложенное Anvaka, великолепно, но, как отметил Джон Боуэн, вам нужно знать немного больше, если вы действительно хотите связать свои элементы со свойствами Canvas.

Вот пример того, как связать с Canvas.Left и Canvas.Top:

<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>

Кстати, я нашел решение по этому вопросу после того, как попробовал предложение Анваки, где привязка не сработала.

Надеюсь, это поможет другим, ища тот же ответ.

...