2013-04-24 13 views
5

this questionと同様の問題が発生していますが、VirtualizingStackPanel.IsVirtualizing="False"で問題が解決しませんでした。誰も同じ問題に直面していますか?ItemContainerGenerator.ContainerFromItem()はnullを返します.VirtualizingStackPanel.IsVirtualizing = "False"

事は、私はカスタムコンボボックスを持っている

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

で、まだ私は内部を経由して、チェックボックスへの参照を取得することはできません、

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

は何か提案はありますか?私は、実行時に変更することができ、他のオブジェクトに依存しているプロパティをにisCheckedチェックボックスを変更したい、私が実際に達成したい何

は、

です。私はこの時点で変更できないプロジェクト全体の現在の状態のためにバインディングを使用することでそれを行うことはできません。あなたはこのようにコンボボックスから、だから、基本的に新しいMultiSelectionComboBoxが、私はこのような何かをしたい作成されると

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

カスタムコンボボックスはどのように見えますか? ComboBoxの完全なXAMLを投稿してください。 – Clemens

+0

VirtualizationStackPanel.IsVirtualizing = "False"をItemsPanelTemplateに設定する前に提案しておいた方が改善されました。しかし、それはまだ私がそれが必要でないところでnullを返します。 –

+0

MultiSelectionComboBoxは実際にコンテナの種類としてComboBoxItemを使用していますか?ところで、StackPanelで 'VirtualizingStackPanel.IsVirtualizing'を設定しても効果はありません。私は仮想化がここで問題ではないと思う。 – Clemens

答えて

12

this.ItemContainerGenerator.ContainerFromItem(item)

+1

ブリリアント!私はこの問題について一時間を失って別の提案をしようとしましたが、この答えが私を助けました! – Daniel

+2

少なくとも、Windowsの電話8;で動作していません) –

+0

このチップは、私のためにいくつかの問題を解決! – Puffin

2

使用ItemContainerGenerator.StatusChangedイベントの前UpdateLayout()を実行してみてください。

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

私のロジックがSelectionChangedイベントにあったので、Listbox.SelectedItemがnullでなくてもさらに奇妙であっても、ItemContainerGenerator.ContainerFromItemメソッドが常にnullを返すのはなぜかと疑問に思っていました.Virtualisation wa sがオフになった! ItemContainerGenerator.Statusを見ると、それはPrimitives.GeneratorStatus.NotStartedであることがわかりました。ItemContainerGenerator.Status == Primitives.GeneratorStatus.ContainersGeneratedの簡単なテストを追加し、最後にそれを解決し、Status_Changedイベントにサブミットする必要はありません。

関連する問題