ListBox ItemTemplate基于父绑定值

时间:2012-08-01 05:01:22

标签: c# wpf xaml .net-3.5 datatemplate

基本上,我希望为我的listitems创建一个自定义模板。一个模板将使用复选框,而另一个模板将使用radioboxes。这是为了模拟何时允许多选。但是,我尝试了许多不同的方法,最有希望的是DataTemplateSelector,但是我需要创建一个依赖属性,以便我可以传入布尔IsMultiSelect值。但是,我需要在选择器中使用DependencyObject,而我能得到的最接近的是contentpresenter。我知道我可以基于此获得父控件,但这似乎是一个黑客。有没有办法完成我想做的事情?

1 个答案:

答案 0 :(得分:1)

我不完全确定我是否理解了所有内容,但这可能会有所帮助:

<ListBox SelectionMode="Multiple">
<!--<ListBox SelectionMode="Single">-->
    <ListBox.Items>
        <TextBlock Text="Test 1" />
        <TextBlock Text="Test 2" />
        <TextBlock Text="Test 3" />
        <TextBlock Text="Test 4" />
        <TextBlock Text="Test 5" />
        <TextBlock Text="Test 6" />
    </ListBox.Items>
    <ListBox.Style>
        <Style TargetType="{x:Type ListBox}">
            <Style.Resources>
                <DataTemplate x:Key="SingleSelectionModeItemTemplate">
                    <RadioButton IsChecked="{Binding Path=IsSelected,
                                                     RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}},
                                                     Mode=TwoWay}"
                                 Content="{Binding}" />
                </DataTemplate>
                <DataTemplate x:Key="MultiSelectionModeItemTemplate">
                    <CheckBox IsChecked="{Binding Path=IsSelected,
                                                  RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}},
                                                  Mode=TwoWay}"
                              Content="{Binding}" />
                </DataTemplate>
            </Style.Resources>
            <Style.Triggers>
                <Trigger Property="SelectionMode"
                         Value="Single">
                    <Setter Property="ItemTemplate" Value="{StaticResource SingleSelectionModeItemTemplate}" />
                </Trigger>
                <Trigger Property="SelectionMode"
                         Value="Multiple">
                    <Setter Property="ItemTemplate" Value="{StaticResource MultiSelectionModeItemTemplate}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.Style>
</ListBox>