Контроль предметов с конечным контролем - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть ItemsControl с пользовательскими элементами управления, завернутыми внутрь. То, чего я хочу добиться - это всегда иметь элемент управления TextBox вместе с моими пользовательскими элементами управления всегда в конце WrapPanel.

Вот небольшой предварительный просмотр:

enter image description here

Наличие ItemsControl позволяет нам иметь элементы управления одного типа. Когда TextBox добавляется после ItemsControl, он, к сожалению, появится в новой строке. Поэтому я вынужден каким-то образом добавить TextBox вместе со своими пользовательскими элементами управления в ItemsControl.

<ItemsControl ItemsSource="{Binding MyItems}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">   
    <!--  Make items wrap  -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <!--  Custom control  -->
    <ItemsControl.ItemTemplate>
        <DataTemplate>

            <local:CustomControl />

        </DataTemplate>
    </ItemsControl.ItemTemplate>

</ItemsControl>

<!-- This should be inside items control -->
<TextBox />

Я провел некоторое исследование, и оказалось, что я могу использовать DataTemplateSelector класс и ItemTemplateSelector, что позволит мне выбрать шаблон для различных предметов.

Это вариант, конечно, однако мне потребуется вставить TextBox в мой MyItems (это, кстати, ObservableCollection.), И я не уверен, что это способ, так как мне придется найти TextBox и переместите его в конце моего ObservableCollection, каждый раз, когда добавляется новый элемент ...

Итак, вопрос в том, как правильно решить эту проблему? Ищу мнение опытных разработчиков по этому поводу.

1 Ответ

0 голосов
/ 30 апреля 2018

Вы можете установить ItemsSource на CompositeCollection :

<ItemsControl ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ItemsControl.Resources>
        <CollectionViewSource x:Key="cvs" Source="{Binding MyItems}" />
    </ItemsControl.Resources>
    <ItemsControl.ItemsSource>
        <CompositeCollection>
            <CollectionContainer Collection="{Binding Source={StaticResource cvs}}" />
            <!-- This should be inside items control: -->
            <TextBox />
        </CompositeCollection>
    </ItemsControl.ItemsSource>
    <!--  Make items wrap  -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!--  Custom control  -->
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:CustomControl />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...