2014-01-21 2 views
0

Я хочу изменить стиль списка в зависимости от коллекции, которую я использую. В моем коде первый класс имеет коллекцию TypeAItemViewModel. Коллекция будет иметь 1 элемент, который нельзя выбрать (предположим как заголовок), и для этого я буду использовать IsHitTestVisible.Как определить стиль для списка в зависимости от коллекции?

Но другой класс использует коллекцию NormalParameter s, которая не имеет 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> 

ListBox: (работа штрафы с коллекцией 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 listbox. Редактировать: Listbox, который я использую, является usercontrol

+0

Как я понимаю, вы хотите добавить 1 пункт TypeAItemViewModel перечислить, а коллекции NormalParameters? –

+0

Нет. У меня есть 2 коллекции. Я хочу отобразить их в другом стиле с помощью 1 xaml listbox. – user3089631

+0

В то же время? –

ответ

0

@Valera спасибо так много. ваш ответ - очень полезная пища для моей проблемы.

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

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

и это ListBox код 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> 
1

Вам нужно определить не выбираемый стиль в ресурсах. И проверьте его в подходящих условиях.

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> 

Это не окончательное решение, но пищу для размышлений :)

 Смежные вопросы

  • Нет связанных вопросов^_^