Как создать свойство IsSelected для пользовательского элемента управления элементами?

Я пытаюсь создать собственный ItemsControl, напрямую наследуя от ItemsControl (WPF/Silverlight, я использую одну и ту же кодовую базу для обоих). Я создал для него класс Item, унаследовав его от ContentControl. Я хочу создать свойство IsSelected для класса Item. Я отразил класс ListBoxItem, но не очень понимаю, как устанавливается свойство IsSelected. Любые предложения / указатели будут действительно полезны.


person Gaurave Sehgal    schedule 07.01.2011    source источник
comment
Почему вы решили расширить ItemsControl, а не Selector или ListBox, которые уже реализуют поведение выбора?   -  person Daniel Pratt    schedule 07.01.2011
comment
Я согласен с Даниэлем. Я пока не нашел причин для создания пользовательской реализации ItemsControl. Какова надежда на расширенную функциональность, так как может быть достаточно просто изменить способ работы элемента управления с помощью шаблонов или каким-либо другим способом.   -  person CodeWarrior    schedule 07.01.2011
comment
Наверное так: Set SelectedItem(ItemsControl) -> внутри сеттера находим контрол-контейнер -> Set IsSelected. Обратным способом вы можете использовать событие PropertyChanged.   -  person vortexwolf    schedule 07.01.2011


Ответы (1)


Если вам нужен ItemsControl без особенностей ListBox, за исключением того, что он внутренне поддерживает концепцию отбора, вы можете легко создать невзрачный ListBox, неотличимый от ItemsControl. Вот два рядом, и вы не можете сказать разницу. Единственное отличие состоит в том, что левый список поддерживает внутреннюю выборку.

<Grid>
    <Grid.Resources>
        <x:Array Type="sys:String" x:Key="sampleData">
            <sys:String>Red</sys:String>
            <sys:String>Green</sys:String>
            <sys:String>Blue</sys:String>
        </x:Array>
    </Grid.Resources>
    <UniformGrid Columns="2">
        <ItemsControl ItemsSource="{StaticResource sampleData}"/>
        <ListBox ItemsSource="{StaticResource sampleData}">
            <ListBox.Style>
                <Style TargetType="ListBox">
                    <Setter Property="Focusable" Value="False"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBox">
                                <ItemsPresenter/>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.Style>
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Focusable" Value="False"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <ContentPresenter/>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>
    </UniformGrid>
</Grid>

Так что лучший совет, если вы хотите выделения, берите производные от ListBox и удаляйте то, что вам не нужно, или, по крайней мере, производные от Selector.

person Rick Sladkey    schedule 10.01.2011