Wpf 如何为自定义项ControlItem创建IsSelected属性?

Wpf 如何为自定义项ControlItem创建IsSelected属性?,wpf,silverlight,wpf-controls,custom-controls,Wpf,Silverlight,Wpf Controls,Custom Controls,我试图通过直接继承ItemsControl(WPF/Silverlight,我对两者使用相同的代码库)来创建自定义ItemsControl。我通过继承ContentControl为它创建了一个Item类。我想为Item类创建IsSelected属性。我反映了ListBoxItem类,但不太清楚IsSelected属性是如何设置的。 任何建议/指针都会非常有用。如果你想要一个项目控件没有列表框功能,但它内部支持选择的概念,你可以轻松创建一个无外观的列表框,它与项目控件没有区别。这是两个并列的,你看

我试图通过直接继承ItemsControl(WPF/Silverlight,我对两者使用相同的代码库)来创建自定义ItemsControl。我通过继承ContentControl为它创建了一个Item类。我想为Item类创建IsSelected属性。我反映了ListBoxItem类,但不太清楚IsSelected属性是如何设置的。
任何建议/指针都会非常有用。

如果你想要一个
项目控件
没有
列表框
功能,但它内部支持选择的概念,你可以轻松创建一个无外观的
列表框
,它与
项目控件
没有区别。这是两个并列的,你看不出有什么区别。唯一的区别是左侧列表在内部支持选择

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

红色
绿色
蓝色

因此,最好的建议是,如果您想要选择,从
列表框
派生,并去掉您不想要的样式,或者至少从
选择器

派生,如果您想要一个
项控件
没有
列表框
功能,除非它内部支持选择的概念,您可以轻松创建一个无外观的
列表框
,它与
项控件
无法区分。这是两个并列的,你看不出有什么区别。唯一的区别是左侧列表在内部支持选择

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

红色
绿色
蓝色

因此,最好的建议是,如果您想要选择,从
列表框
派生并去掉您不想要的样式,或者至少从
选择器

派生为什么您选择扩展
项控件
,而不是
选择器
列表框
,哪个已经实现了选择行为?我同意Daniel的观点。我还没有找到创建ItemsControl自定义实现的理由。希望的扩展功能是什么,因为它可能足够简单,可以通过模板或其他方式更改控件的工作方式。可能是这样的:Set SelectedItem(ItemsControl)->在setter中查找控件容器->Set IsSelected。相反,您可以使用PropertyChanged事件。为什么选择扩展
ItemsControl
,而不是已经实现选择行为的
选择器
列表框
。我还没有找到创建ItemsControl自定义实现的理由。希望的扩展功能是什么,因为它可能足够简单,可以通过模板或其他方式更改控件的工作方式。可能是这样的:Set SelectedItem(ItemsControl)->在setter中查找控件容器->Set IsSelected。相反,您可以使用PropertyChanged事件。