2014-06-17 119 views
0

我在我的應用程序中有一個列表框控件。 我想改變他的風格,看起來像Datagrid(邊框,列,行...)。 我不想使用stantard datagrid - 因爲它的控件無法綁定itemtemplte。 我試圖做到這一點:wpf ListBox看起來像datagrid?

<ListBox 
        ItemsSource="{Binding Items}" 
        HorizontalContentAlignment="Stretch" 
        VerticalContentAlignment="Stretch" 
        Name="listBox1" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" > 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <Grid> 
           <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
            <Border BorderThickness="1" BorderBrush="Black"> 
             <TextBlock Text="{Binding Id}" Margin="5"/> 
            </Border> 
            <Border BorderThickness="1" BorderBrush="Black"> 
             <TextBlock Text="{Binding Name}" Margin="5"/> 
            </Border> 
           </StackPanel> 
          </Grid> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 

但它並不好看 - 如下:

enter image description here

它就是我想要實現:

enter image description here

+0

你問的是如何使每個項目在列表框中統一大小? –

+0

是的,有可能嗎? –

+0

*我不想使用stantard datagrid - 因爲它的控件無法綁定itemtemplte * ...請仔細說明這句話嗎?我認爲你*可能會被誤認爲是可能會使用DataGrid。 – Sheridan

回答

1

使用Grid.IsSharedSizeScope

結果

SharedSizeScope example

我相信你要根據你的字符串長度的列被重新調整大小,所以Grid.IsSharedSizeScope是你的選擇在這裏

例如XAML

<ListBox ItemsSource="{Binding Items}" 
      Grid.IsSharedSizeScope="True"> 
     <ListBox.Resources> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ListBoxItem"> 
          <ContentPresenter /> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListBox.Resources> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition SharedSizeGroup="name" /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <Border BorderThickness="1" 
          BorderBrush="Black"> 
         <TextBlock Text="{Binding Name}" 
            Margin="5" /> 
        </Border> 
        <Border BorderThickness="1" 
          Grid.Column="1" 
          BorderBrush="Black"> 
         <TextBlock Text="{Binding Id}" 
            Margin="5" /> 
        </Border> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

如果移動SharedSizeGroup到ID像下面

<Grid.ColumnDefinitions> 
    <ColumnDefinition /> 
    <ColumnDefinition SharedSizeGroup="id" /> 
</Grid.ColumnDefinitions> 

結果

SharedSizeScope example 2

使用ListView控件與GridView控件

你必須使用列表視圖,網格視圖選項,這將具有相同的外觀網格列表的靈活性

<ListView ItemsSource="{Binding SourceItems}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Column1" 
           DisplayMemberBinding="{Binding Column1}" /> 
       <GridViewColumn Header="Column2" 
           DisplayMemberBinding="{Binding Column2}" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

GridViewColumn爲您提供了修改CellTemplate,HeaderTemplate,HeaderContainerStyle,HeaderStringFormat等

+0

謝謝,但我不想使用listview + gridview,這是因爲我無法綁定自定義itemtemplate進入gridview .. –

+0

你可以使用CellTemplate來指定你的自定義模板。 – pushpraj

+0

CellTemplate是指定每個列的自定義模板 - 我的意思是我想綁定一個itemtemplate列,它不可能在gridview,gridview,我需要寫:GridView-> GridView.Columns - > ... –

0

我確保你可以使用網格控件(它支持綁定和其他所有內容)

要解決您的問題,您將不得不在固定的寬度內爲您的堆疊面板內的邊框,然後您的列表框項目將看起來像一個網格控件。

<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
            <Border Width="150" BorderThickness="1" BorderBrush="Black"> 
             <TextBlock Text="{Binding Id}" Margin="5"/> 
            </Border> 
            <Border Width="50" BorderThickness="1" BorderBrush="Black"> 
             <TextBlock Text="{Binding Name}" Margin="5"/> 
            </Border> 
           </StackPanel> 

請讓我們知道您正在使用GridControl有什麼問題,也許我們可以解決這個問題,以及

編輯。如果您正在使用一個DataGrid模板看起來像

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" HeadersVisibility="None"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="" Width="SizeToCells" IsReadOnly="True"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text={Binding Id}/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
<DataGridTemplateColumn Header="" Width="SizeToCells" IsReadOnly="True"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text={Binding Name}/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

請注意,我已經設置HeaderVisibility爲false,以便它doesnt看起來像一個數據網格,而是看起來像一個列表

+0

謝謝,我不想設置固定寬度,因爲soemtimes有一個長句或短句 - 我想將listboxitem擴展到最長項目的最大寬度。網格控制?你的意思是數據網格嗎?或網格?網格可以獲取itemsource?和樣式itemtemplate? –

+0

對不起GridControl,你可以定義itemssource,然後爲你的數據項目定義模板 – Krishna

+0

wpf沒有GridControl - 你的意思是devexpress控制? –