2010-03-16 59 views
3

我在WPF中創建了一個樣式的列表框,以便它呈現爲複選框列表。WPF - 列表框忽略樣式當ItemsSource綁定

當我手動填充ListBox的項目時,樣式完美地工作。但是,當我將ListBox的ItemsSource綁定到靜態資源(包含所需項目的ItemsControl)時,樣式完全被刪除。

這裏的風格:

<Style x:Key="CheckBoxListStyle" TargetType="ListBox"> 
    <Style.Resources> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBoxItem"> 
         <Grid Margin="2"> 
          <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition /> 
          </Grid.ColumnDefinitions> 
          <CheckBox IsChecked="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/> 
          <ContentPresenter 
           Grid.Column="1" 
           Margin="2,0,0,0" /> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Style.Resources> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Vertical" /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="BorderThickness" Value="0" /> 
    <Setter Property="Background" Value="Transparent" /> 
</Style> 

下面是正確顯示樣式列表框代碼:

<ListBox x:Name="ColumnsList" 
      Grid.Column="0" 
      Grid.Row="0" 
      Style="{StaticResource CheckBoxListStyle}" 
      BorderThickness="1">             
      <ListBox.Items> 
       <ListBoxItem>Test</ListBoxItem> 
       <ListBoxItem>Test2</ListBoxItem> 
       <ListBoxItem>Test3</ListBoxItem> 
      </ListBox.Items> 
     </ListBox> 

下面是ListBox中的代碼,忽略風格:

<ListBox x:Name="ColumnsList2" 
      Grid.Column="0" 
      Grid.Row="0" 
      Style="{StaticResource CheckBoxListStyle}" 
      BorderThickness="1" 
      ItemsSource="{Binding Source={StaticResource Test1}, Path=Items}"> 
     </ListBox> 

希望有人能幫助 - 我對這一切都很陌生,並嘗試過所有我能想到的,但是我讀過的所有東西都讓我相信,設置ItemsSource應該與手動設置項目的結果相同,所以我看不出任何原因,這是行不通的。

感謝,

AT

回答

6

將Style.Resources更改爲設置ItemContainerStyle屬性,它應該像魅力一樣工作。

<Style x:Key="CheckBoxListStyle" TargetType="ListBox"> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="Template"> 
        <Setter.Value> 
          <ControlTemplate TargetType="ListBoxItem"> 
          <Grid Margin="2"> 
           <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto" /> 
             <ColumnDefinition /> 
           </Grid.ColumnDefinitions> 
           <CheckBox IsChecked="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/> 
           <ContentPresenter 
            Grid.Column="1" 
            Margin="2,0,0,0" /> 
          </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Vertical" /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="BorderThickness" Value="0" /> 
    <Setter Property="Background" Value="Transparent" /> 
</Style> 

在(SP1)之前的舊版本,當你定義Style S IN風格,這些風格的人會被忽略。或者,您可以在父資源中設置樣式資源..

希望這有助於!

+0

偉大 - 除了你忘記Setter.Value標記。除此之外,它似乎工作。謝謝! – 2010-03-16 17:30:08

+0

好點,我在答案中加入了:) – Arcturus 2010-03-17 08:25:01

1

這是因爲你在CheckListBoxStyle TargetType的是靶向一個ListBoxItem的,但是當你設定ListBox的的ItemSource屬性,您綁定到其他元素的列表(整型例)。這意味着你的目標類型應該是int而不是ListBoxItem。

或者,不要指定目標類型。