2016-04-14 16 views
0

Ich versuche eine benutzerdefinierte ComboBox erstellen, die eine DataGrid als PopUp hat. Ich überschrieben den Standard Template, aber wenn ich die ItemsHost zum DataGrid (IsItemsHost="True") setze ich erhalte The member "IsItemsHost" is not recognized or is not accesible (wie erwartet)ComboBox mit DataGrid PopUp

<Popup Name="Popup" 
     Placement="Bottom" 
     IsOpen="{TemplateBinding IsDropDownOpen}" 
     AllowsTransparency="True" 
     Focusable="False" 
     PopupAnimation="Slide"> 
     <Grid Name="DropDown" 
      SnapsToDevicePixels="True"    
      MinWidth="{TemplateBinding ActualWidth}" 
      MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
      <Border x:Name="DropDownBorder" 
        Background="White" 
        BorderThickness="1" 
        BorderBrush="LightGray"/> 
        <ScrollViewer Margin="1,2" SnapsToDevicePixels="True"> 
          <DataGrid IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /> 
        </ScrollViewer> 
     </Grid> 
</Popup> 

Wie kann ich das umsetzen?

Fortschritt:

Nach Microsoft:

Wenn Sie eine Control für eine ComboBox erstellen, Ihre Vorlage könnte eine Itemspresenter innerhalb eines Scroll enthalten. (Der ItemsPresenter zeigt jedes Element in der ComboBox an; der ScrollViewer ermöglicht das Scrollen innerhalb des Steuerelements). Wenn der ItemsPresenter nicht das direkte Kind des ScrollViewers ist, müssen Sie dem ItemsPresenter den Namen ItemsPresenter geben.

So funktioniert das (wenn ich eine komplette Lösung habe ich es als Antwort hinzufügen wird):

<Popup Name="Popup" 
     Placement="Bottom" 
     IsOpen="{TemplateBinding IsDropDownOpen}" 
     AllowsTransparency="True" 
     Focusable="False" 
     PopupAnimation="Slide"> 
    <Grid Name="DropDown" 
      SnapsToDevicePixels="True"    
      MinWidth="{TemplateBinding ActualWidth}" 
      MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
     <Border x:Name="DropDownBorder" 
       Background="White" 
       BorderThickness="1" 
       BorderBrush="LightGray"/> 
      <ScrollViewer Margin="1,2" SnapsToDevicePixels="True"> 
        <StackPanel Orientation="Vertical" > 
         <DataGrid x:Name="ItemsPresenter" ItemsSource="{TemplateBinding ItemsSource}" KeyboardNavigation.DirectionalNavigation="Contained"></DataGrid> 
         <Border Height="10" Background="Red" /> 
        </StackPanel> 
      </ScrollViewer> 
     </Grid> 
</Popup> 
+0

, wo und wie wird dieses Popup angezeigt/present würde gezeigt /? – AnjumSKhan

+0

Dies ist der 'Popup'-Teil der überschriebenen' ComboBox' 'Template'. Ich kann das vollständige 'Template' hinzufügen, wenn es hilfreich ist –

Antwort

0

ich es geschafft, zu bekommen, was ich vom Stil Balg (mein Ziel ist die Schaffung eines ComboBox für Paging) gesucht:

 <Style x:Key="DataGridComboBoxStyle" TargetType="{x:Type ComboBox}"> 
     <Setter Property="Foreground" Value="DimGray" /> 
     <Setter Property="BorderBrush" Value="LightGray" /> 
     <Setter Property="Background" Value="White" /> 
     <Setter Property="SnapsToDevicePixels" Value="True"/> 
     <Setter Property="OverridesDefaultStyle" Value="True"/> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
     <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
     <Setter Property="ScrollViewer.CanContentScroll" Value="true"/> 
     <Setter Property="FontSize" Value="12" /> 
     <Setter Property="FontFamily" Value="Tahoma, Verdana" /> 
     <Setter Property="Height" Value="25" /> 
     <Setter Property="HorizontalContentAlignment" Value="Left" /> 
     <Setter Property="MaxDropDownHeight" Value="250" /> 
     <Setter Property="StaysOpenOnEdit" Value="True" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ComboBox"> 
        <Grid> 
         <ToggleButton Name="ToggleButton" 
             BorderBrush="{TemplateBinding BorderBrush}" 
             Background="{TemplateBinding Background}" 
             Foreground="{TemplateBinding Foreground}" 
             Style="{StaticResource ComboBoxToggleButton}" 
             Grid.Column="2" 
             Focusable="false" 
             IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" 
             ClickMode="Press"> 
         </ToggleButton> 
         <ContentPresenter Name="ContentSite" 
              IsHitTestVisible="False" 
              Content="{Binding ElementName=ItemsPresenter, Path=SelectedItem}" 
              ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" 
              ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
              Margin="10,3,30,3" 
              VerticalAlignment="Center" 
              HorizontalAlignment="Center" /> 
         <TextBox x:Name="PART_EditableTextBox" 
           Style="{x:Null}" 
           SelectionBrush="Transparent" 
           Template="{StaticResource ComboBoxTextBox}" 
           Text="{Binding ElementName=ItemsPresenter, Path=SelectedItem}" 
           Foreground="{TemplateBinding Foreground}" 
           FontFamily="{TemplateBinding FontFamily}" 
           FontSize="{TemplateBinding FontSize}" 
           FontWeight="{TemplateBinding FontWeight}" 
           HorizontalAlignment="Stretch" 
           HorizontalContentAlignment="Left" 
           VerticalAlignment="Stretch" 
           VerticalContentAlignment="Center" 
           Background="Transparent" 
           Margin="3,3,23,3" 
           Focusable="True"        
           Visibility="Hidden" 
           IsReadOnly="{TemplateBinding IsReadOnly}"/> 
         <Popup Name="Popup" 
           Placement="Bottom" 
           IsOpen="{TemplateBinding IsDropDownOpen}" 
           AllowsTransparency="True" 
           Focusable="False" 
           PopupAnimation="Slide"> 
          <Grid Name="DropDown" 
            SnapsToDevicePixels="True"    
            MinWidth="{TemplateBinding ActualWidth}" 
            MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
           <Border x:Name="DropDownBorder" 
             Background="White" 
             BorderThickness="1" 
             BorderBrush="LightGray"/> 
           <ScrollViewer Margin="1,2" SnapsToDevicePixels="True" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Disabled"> 
            <StackPanel Orientation="Vertical" > 
             <DataGrid x:Name="ItemsPresenter" 
                IsReadOnly="True" 
                ScrollViewer.CanContentScroll="True" 
                ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                ScrollViewer.VerticalScrollBarVisibility="Auto" 
                ItemsSource="{TemplateBinding ItemsSource}" 
                BorderBrush="Transparent" 
                RowHeaderWidth="0" 
                RowHeight="20" 
                ColumnWidth="*" 
                HeadersVisibility="None" 
                GridLinesVisibility="None" 
                KeyboardNavigation.DirectionalNavigation="Contained"> 
             </DataGrid> 
             <Border BorderBrush="LightGray" BorderThickness="0, 1, 0, 0"> 
              <DockPanel LastChildFill="True" Background="White" Margin="5"> 
               <Button Style="{StaticResource DataGridPagingButtonStyle}" DockPanel.Dock="Left" > 
                <Button.Content> 
                 <UniformGrid Margin="1"> 
                  <Path Height="20" Width="20" Stroke="DarkGray" Stretch="Uniform" StrokeThickness="1" Data="M 4,1 L 1,4 L 4,7" /> 
                 </UniformGrid> 
                </Button.Content> 
               </Button> 
               <Button Style="{StaticResource DataGridPagingButtonStyle}" DockPanel.Dock="Right"> 
                <Button.Content> 
                 <UniformGrid Margin="1"> 
                  <Path Height="20" Width="20" Stroke="DarkGray" Stretch="Uniform" StrokeThickness="1" Data="M1,1 L4,4 1,7" /> 
                 </UniformGrid> 
                </Button.Content> 
               </Button> 
               <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" DockPanel.Dock="Left"> 
                <TextBlock FontFamily="Tahoma, Verdana" FontSize="11" Foreground="DimGray" VerticalAlignment="Center" Padding="0, 0, 5, 2" Text="Page" /> 
                <TextBox BorderBrush="LightGray" FontFamily="Tahoma, Verdana" FontSize="11" Foreground="DimGray" Height="20" Width="20" HorizontalContentAlignment="Center" Text="1" /> 
                <TextBlock FontFamily="Tahoma, Verdana" FontSize="11" Foreground="DimGray" VerticalAlignment="Center" Padding="5, 0, 5, 2" Text="to" /> 
                <TextBlock FontFamily="Tahoma, Verdana" FontSize="11" Foreground="DimGray" VerticalAlignment="Center" Padding="0, 0, 0, 2" Text="(bind pages)" /> 
               </StackPanel> 
              </DockPanel> 
             </Border> 
            </StackPanel> 
           </ScrollViewer> 
          </Grid> 
         </Popup> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <!-- Triggers --> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
0

Statt DataGrid, verwenden Sie einen Panel (Stackpanel/Grid usw.).

Als IsItemsHost Eigenschaft ist Mitglied von Panel und es ist kein attached property, so dass Sie es nicht mit DataGrid verwenden können.

Panel.IsItemsHost Property

Wenn aber, wie Sie Ihre Einzelteile wünschen, in einem DataGrid gezeigt wird, dann haben Sie ItemsSource Ihre DataGrid zur Items Sammlung der ComboBox zeigen verwenden.

Wenn Sie ComboBoxItem direkt in ComboBox ohne fremde DataSource verwenden, dann unter Code funktionieren:

<DataGrid ItemsSource="{Binding Items, RelativeSource={RelativeSource TemplatedParent}}"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ComboBoxItem Content="{Binding Content}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Und wenn Sie etwas außerhalb Datasource verwenden, dann {Binding Content} mit {Binding someproperty} ersetzen.

Ich habe ein funktionierendes Beispiel genau wie Ihr Code gemacht, und es funktioniert gut.

+0

Ich weiß das. Der Standard 'Template' verwendet' StackPanel'. Das Problem ist, dass ich 'ComboBoxItem's innerhalb eines' DataGrid' wünschen würde –

+0

Danke für Ihre Hilfe. Ich fand diesen Ansatz, als ich nach einer Lösung suchte. Der einzige Nachteil dabei ist, dass es nicht wiederverwendbar sein kann. Ich kann das nicht in einem Stil umsetzen. Ich werde weiter nach einer besseren Lösung suchen, wenn ich nicht auf etwas eingehe, werde ich deine Antwort akzeptieren. Nochmals vielen Dank für Ihre Mühe. –

+0

@ Απόπατος wer hat dir gesagt, dass es nicht in einem Stil implementiert werden kann?Deklarieren Sie Ihre 'ControlTemplate' als Ressource und verwenden Sie sie in Ihrer' ComboBox'. – AnjumSKhan

Verwandte Themen