Использование сетки в качестве панели для ItemsControl - PullRequest
0 голосов
/ 10 июля 2020

Я нашел этот учебник Использование сетки в качестве панели для ItemsControl , но мне не удалось заставить его работать.

Я получаю это исключение:

'Cannot explicitly modify Children collection of Panel used as ItemsPanel for ItemsControl. ItemsControl generates child elements for Panel.'

вызвано grid.Children.Add(child) в этом l oop

foreach (FrameworkElement child in phantom.Children.ToList())
         {
           phantom.Children.Remove(child);
           grid.Children.Add(child);
           // ensure the child maintains its original datacontext
           child.DataContext = phantom.DataContext;
         }

Возможна ли работа путем наследования от ItemsPanel?

Ответы [ 2 ]

0 голосов
/ 26 июля 2020

Подгонка Grid в ItemsControl - не лучшая идея.

Вы теряете функцию ItemsControl. Питер Дунихо упомянул в комментариях, что ItemContainer - это то место, где вы видите прикрепленные свойства. Для моего приложения мне нужно было использовать функциональность Selector. Если бы я использовал Grid, мне пришлось бы реализовать это самому, но я избавил себя от множества проблем, просто используя Listbox.

Если вы хотите использовать сетку, я предлагаю вам изучить ListView, а также GridView. И если это недостаточно гибко, вы всегда можете написать свой собственный ViewBase.

0 голосов
/ 10 июля 2020

Вы взяли за основу дурной пример. Все можно сделать в XAML - это основной язык для WPF. В простейшем виде это должно выглядеть так:

<Window x:Class="ItemsControlGrid.ItCntGridWind"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ItemsControlGrid"
        mc:Ignorable="d"
        Title="ItCntGridWind" Height="450" Width="800">
    <Window.Resources>
        <x:Array x:Key="Points.Grid" Type="Point">
            <Point X="1" Y="0"/>
            <Point X="0" Y="2"/>
            <Point X="2" Y="1"/>
        </x:Array>
        <ItemsPanelTemplate x:Key="Grid.Panel">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </Window.Resources>
    <Grid>
        <ItemsControl ItemsSource="{Binding Mode=OneWay, Source={StaticResource Points.Grid}}" 
                      ItemsPanel="{StaticResource Grid.Panel}">
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="Point">
                    <Ellipse Fill="Coral"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemContainerStyle>
                <Style>
                    <Setter Property="Grid.Row" Value="{Binding Y}"/>
                    <Setter Property="Grid.Column" Value="{Binding X}"/>
                </Style>
            </ItemsControl.ItemContainerStyle>
        </ItemsControl>
    </Grid>
</Window>

Если вы не понимаете, как применить этот пример к вашей задаче, то дайте более подробную информацию о том, что и как вы хотите реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...