2013-04-25 111 views
2

我有一個以下問題。我想要ListBoxDataTemplateGrid。這個網格有兩個兩列。我想要設置第一列寬度爲3*,另一個爲*。這個怎麼做?我將複製我的代碼。wpf listbox和datatemplate格內

<ListBox x:Name="commandListbox" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Stretch"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="3*" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Grid.Column="0" Text="{Binding}"/> 
       <TextBlock Grid.Column="1" Text="icon" /> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate>     
</ListBox> 
+1

該線程不是很有幫助。目前尚不清楚實際問題是什麼。 – shawn1874 2015-02-10 18:26:46

回答

6

更好的存儲資源模板:

<Window.Resources> 
    <DataTemplate x:Key="DefaultTemplate"> 
    <Grid x:Name="GridItem" Width="200"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 

     <TextBlock x:Name="Parameter" Grid.Column="1" Text="{Binding Path=Name}" Margin="5,1,0,0" /> 
     <TextBlock x:Name="Value" Grid.Column="2" Text="{Binding Path=Age}" Margin="85,1,0,0" /> 

     <Line x:Name="Separator" X1="0" X2="0" Y1="0" Y2="20" SnapsToDevicePixels="True" Grid.Column="1" Stroke="Black" StrokeThickness="2" Margin="50,0,0,0" HorizontalAlignment="Left" /> 
    </Grid> 
</DataTemplate> 
</Window.Resources> 

ListBox的定義:

<ListBox Name="MyListBox" ItemTemplate="{StaticResource DefaultTemplate}" /> 

在代碼的C#:

public class Person 
{ 
    public string Name 
    { 
    get; 
    set; 
    } 

public int Age 
{ 
    get; 
    set; 
} 
} 

定義的ObservableCollection:

在收集個
private ObservableCollection<Person> MyListBoxData = new ObservableCollection<Person>(); 

並添加項目:

MyListBoxData.Add(new Person() 
{ 
    Name = "Nick", 
    Age = 21, 
}); 

MyListBoxData.Add(new Person() 
{ 
    Name = "Adam", 
    Age = 11, 
}); 

MyListBox.ItemsSource = MyListBoxData; 

編輯:

然後設置寬度= 「3 *」 WIDTH = 「*」 和保證金= 「 - WidthGrid」 的第一TextBlock的:

<Grid x:Name="GridItem" Width="300"> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="3*" /> 
    <ColumnDefinition Width="*" /> 
</Grid.ColumnDefinitions> 

<TextBlock x:Name="Parameter" Grid.Column="1" Text="{Binding Path=Name}" Margin="-220,0,0,0" /> 
<TextBlock x:Name="Value" Grid.Column="2" Text="{Binding Path=Age}" Margin="0,0,0,0" /> 
</Grid> 
+1

我不想設置常量值或自動。這不是我的問題的答案。我想有2列,其中一個包含3/4的屏幕和另一個1/4。 – MistyK 2013-04-25 11:54:00

3

使用IsSharedSizeScope共享列寬跨產生的網格,用於自動寬度(不能不要E對於*上漿):

通過http://wpftutorial.net/DataTemplates.html

<ListBox ItemsSource="{Binding}" BorderBrush="Transparent" 
    Grid.IsSharedSizeScope="True" 
    HorizontalContentAlignment="Stretch"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid Margin="4"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" SharedSizeGroup="Key" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding Name}" FontWeight="Bold" /> 
      <TextBox Grid.Column="1" Text="{Binding Value }" /> 
     </Grid> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

See MSDN remarks

列和參加大小共享行不尊重星上漿。在這種情況下,Star尺寸被視爲Auto。 如果IsSharedSizeScope在資源模板中設置爲true,並且在該模板外定義了SharedSizeGroup,則網格大小共享不起作用。

1
<ListBox x:Name="commandListbox" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Stretch"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="0.75*" /> 
        <ColumnDefinition Width="0.25*" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Grid.Column="0" Text="{Binding}"/> 
       <TextBlock Grid.Column="1" Text="icon" /> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate>     
</ListBox> 

如果我理解正確的話,你正在尋找第1列3/4的空間和第2列1/4的空間。以上述格式設置寬度必須解決問題。

希望它解決。