如何根据集合定义列表框的样式?

时间:2014-01-21 08:37:28

标签: c# wpf xaml listbox itemcontainerstyle

我想根据我使用的集合更改列表框的样式。 在我的代码中,第一个类有一个TypeAItemViewModel的集合。该集合将有1个无法选择的项目(假设为标题),为此,我将使用IsHitTestVisible

但另一个类使用的NormalParameter集合没有IsHitTestVisible。然后,当我使用带有NormalParameter集合的视图时,它会给出一个没有IsHitTestVisible属性的错误。

public List<NormalParameters> Items{get;set;}
public List<TypeAItemViewModel> Items;

类: TypeAItemViewModel

public class TypeAItemViewModel
{
    private TypeAParameter _parameter;      
    public bool IsHitTestVisible{get;set;}
}

风格:

<Style x:Key="SelectableListBoxItem" TargetType="{x:Type ListBoxItem}">
    <Setter Property="IsHitTestVisible" Value="{Binding IsHitTestVisible}" />   
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsHitTestVisible}" Value="false">
            <Setter Property="FontWeight" Value="SemiBold" />
            <Setter Property="FontSize" Value="{StaticResource FontSizeTextBlock}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

列表框:(使用TypeAItemViewModel集合处理罚款)

<ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ItemContainerStyle="{DynamicResource SelectableListBoxItem}">
    <ListBox.ItemTemplate>                    
        <DataTemplate>
            <Grid Height="{StaticResource Height}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="100" />
                </Grid.ColumnDefinitions>
                <Grid Grid.Column="0">
                    <TextBlock DataContext="{Binding Name}" Text="{Binding Value}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                </Grid>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我认为应该使用ItemContainerStyle,但我仍然无法解决它。

如果不清楚,请告诉我。

编辑我有2个收藏。我想用1 xaml列表框显示不同的样式。 编辑:我使用的列表框是用户控件

2 个答案:

答案 0 :(得分:1)

您需要在资源中定义不可选择的样式。并在programmicaly的适当条件下检查它。

MyListBox.ItemContainerStyle = (Style) MyListBox.Resources["SelectableListBoxItem"];
or
MyListBox.ItemContainerStyle = null;

你的XAML

<ListBox x:Name="MyListBox" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ItemContainerStyle="{DynamicResource SelectableListBoxItem}">
<ListBox.Resources>
<Style x:Key="SelectableListBoxItem" TargetType="{x:Type ListBoxItem}">
    <Setter Property="IsHitTestVisible" Value="{Binding IsHitTestVisible}" />   
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsHitTestVisible}" Value="false">
            <Setter Property="FontWeight" Value="SemiBold" />
            <Setter Property="FontSize" Value="{StaticResource FontSizeTextBlock}" />
        </DataTrigger>
        <Trigger Property="IsSelected" Value="True">
             <Setter Property="Background" Value="{x:Null}" />
             <Setter Property="BorderBrush" Value="{x:Null}" />
        </Trigger>
    </Style.Triggers>
    </Style>
</ListBox.Resources>

    <ListBox.ItemTemplate>                    
... your template
    </ListBox.ItemTemplate>
</ListBox>

这不是最终的解决方案,但值得深思:()

答案 1 :(得分:0)

@Valera非常感谢你。你的答案对我的问题来说是非常健康的食物。

我添加了一个新的布尔属性,然后用它来定义我想要使用的样式。

<Style x:Key="ListBoxWithIsHitTestVisible" TargetType="{x:Type ListBox}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsListBoxWithHeaderItem}" Value="true">
            <Setter Property="ItemContainerStyle" Value="{DynamicResource SelectableListBoxItem}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

<Style x:Key="SelectableListBoxItem" TargetType="{x:Type ListBoxItem}">
    <Setter Property="IsHitTestVisible" Value="{Binding IsHitTestVisible}" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsHitTestVisible}" Value="false">
            <Setter Property="FontWeight" Value="SemiBold" />
            <Setter Property="FontSize" Value="{StaticResource FontSizeTextBlock}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

这是一个列表框xaml代码

<ListBox Grid.Row="1" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" Style="{StaticResource ListBoxWithIsHitTestVisible}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Height="{StaticResource Height}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="100" />
                </Grid.ColumnDefinitions>
                <Grid Grid.Column="0">
                    <TextBlock DataContext="{Binding Name}" Text="{Binding Value}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                </Grid>
            </Grid>
        </DataTemplate>                    
    </ListBox.ItemTemplate>
</ListBox>