2013-04-24 23 views
5

this question ile benzer bir sorunla karşılaşıyorum ancak VirtualizingStackPanel.IsVirtualizing="False" benim sorunumu çözmedi. Aynı konuyla karşı karşıya olan var mı? ItemContainerGenerator.ContainerFromItem() null değerini döndürürken VirtualizingStackPanel.IsVirtualizing = "False"

this.ItemContainerGenerator.ContainerFromItem(this.Items[0]) as ComboBoxItem; 

herhangi bir öneri var mı,

şey, özel bir combobox var

<Style TargetType="{x:Type MultiSelectionComboBox}" > 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Vertical" 
       VerticalAlignment="Center" 
       HorizontalAlignment="Center" 
       VirtualizingStackPanel.IsVirtualizing="False"/> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="ItemTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal" x:Name="ItemStack" VirtualizingStackPanel.IsVirtualizing="False"> 
        <CheckBox x:Name="CheckBoxItem" 
         Command="{Binding SelectItem, RelativeSource={RelativeSource AncestorType={x:Type MultiSelectionComboBox}}}" 
         CommandParameter="{Binding Key}" 
           > 
        </CheckBox> 
        <TextBlock Text="{Binding DisplayText}"></TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ComboBox}"> 
       <Grid x:Name="Placement" SnapsToDevicePixels="true"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*"/> 
         <ColumnDefinition Width="Auto"/> 
        </Grid.ColumnDefinitions> 
        <Border BorderThickness="1" BorderBrush="Black"> 
         <TextBox IsReadOnly="True" Grid.Column="0" 
           Text="{Binding Text, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type MultiSelectionComboBox}}}"> 
         </TextBox> 
        </Border> 
        <Popup x:Name="PART_Popup" 
           Grid.Column="0" 
           Focusable="False" 
           Grid.ColumnSpan="2" 
           IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" 
           Placement="Bottom" 
           VerticalOffset="-1" 
           PlacementTarget="{Binding ElementName=LayoutRoot}"> 
         <Popup.Resources> 
          <Style TargetType="{x:Type ScrollBar}" BasedOn="{StaticResource {x:Type ScrollBar}}"> 
           <Style.Triggers> 
            <Trigger Property="Orientation" Value="Vertical"> 
             <Setter Property="BorderThickness" Value="0"/> 
            </Trigger> 
           </Style.Triggers> 
          </Style> 
         </Popup.Resources> 
         <ScrollViewer x:Name="DropDownScrollViewer" 
              Background="{StaticResource Background}" 
              BorderBrush="{TemplateBinding BorderBrush}" 
              BorderThickness="{TemplateBinding BorderThickness}" 
              MinWidth="{Binding ActualWidth, ElementName=LayoutRoot}" 
              MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
          <ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained"/> 
         </ScrollViewer> 
        </Popup> 
        <ToggleButton IsEnabled="{Binding IsEnabled, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type MultiSelectionComboBox}}}" Grid.Column="1" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxToggleButton}"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
</ResourceDictionary> 

ve henüz içimde yoluyla onay kutusunun bir başvuru alınamıyor? Ne ben aslında ulaşmak istiyoruz

, Onay kutularını çalışma zamanı üzerinde değişiklikler yapabilecekleri başka bir nesneye bağlı olduğu isChecked özelliğini değiştirmek isteyen

. Bu noktada değiştiremediğim genel projenin mevcut durumu nedeniyle bağlayıcıları kullanarak yapamam. Böyle combobox'dan Yani temelde yeni MultiSelectionComboBox, ben böyle bir şey yapmak istiyorum oluşturulduktan sonra

foreach (object item in this.Items) 
{ 
    ComboBoxItem comboBoxItem = this.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem; 
    if (comboBoxItem == null) 
     continue; 
    FrameworkElement element = comboBoxItem.ContentTemplate.LoadContent() as FrameworkElement; 
    CheckBox checkBox = element.FindName("CheckBoxItem") as CheckBox; 
    checkBox.IsChecked = this.SelectedItem.Contains(item); 
} 
+0

Özel ComboBox'ınız neye benziyor? Lütfen ComboBox'ın tam XAML'sini gönderin. – Clemens

+0

VirtualizingStackPanel.IsVirtualizing = ItemsPanelTemplate için "False" ayarını vermeden önce verdiğiniz öneri, bazı iyileştirmelerle sonuçlandı. Ancak hala ihtiyacım olmadığı yere null döndürüyor. –

+0

MultiSelectionComboBox'ın aslında ComboBoxItem'i kapsayıcı türü olarak kullandığından emin misiniz? Ve bu arada, bir StackPanel üzerinde 'VirtualizingStackPanel.IsVirtualizing' ayarının da bir etkisi yoktur. Sanırım sanallaştırma sorun değil. – Clemens

cevap

12

this.ItemContainerGenerator.ContainerFromItem(item)

+1

Parlak! Farklı önerileri denemek için problemin tamamını bir saat kaybettim ve bu cevap bana yardımcı oldu! – Daniel

+2

çalışmıyor, en azından Windows 8;) –

+0

Kutsal moly bu ipucu benim için birkaç sorunu çözdü! – Puffin

2

Kullanım ItemContainerGenerator.StatusChanged olaydan önce UpdateLayout() yürütmek deneyin:

myComboBox.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged; 

void ItemContainerGenerator_StatusChanged(object sender, System.EventArgs e) 
{ 
    if (myComboBox.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) 
    { 
     foreach (var item in myComboBox.Items) 
     { 
      var container = (ComboBoxItem)LanguageComboBox.ItemContainerGenerator.ContainerFromItem(item); 
     } 
    } 
} 
0

Benim mantık SelectionChanged olayında olduğu gibi, Listbox.SelectedItem null ve hatta daha garip bile olmasa bile, ItemContainerGenerator.ContainerFromItem yönteminin null neden her zaman null döndü, Virtualisation wa s kapalı! ItemContainerGenerator.Status'a baktığımda bunun Primitives.GeneratorStatus.NotStarted olduğunu gördüm ve ItemContainerGenerator.Status == Primitives.GeneratorStatus.ContainersGenerated'a basit bir test ekledim ve nihayet bu şekilde çözdüm ve Status_Changed olayına başvurmaya gerek yok.

İlgili konular