2015-09-08 8 views
7

मैं निम्न मार्कअप (XAML) है दे रही है:WPF लिस्टबॉक्स कॉलम एक हैडर

<ListBox Name="lbEurInsuredType" HorizontalContentAlignment="Stretch"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid Margin="0,2"> 
         <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="100"></ColumnDefinition> 
          <ColumnDefinition Width="30"></ColumnDefinition><ColumnDefinition Width="2"></ColumnDefinition> 
          <ColumnDefinition Width="30"></ColumnDefinition> 
        </Grid.ColumnDefinitions> 
        <TextBlock Text="{Binding Title}"></TextBlock> 
        <TextBox Text="{Binding Uw}" Grid.Column="1"></TextBox> 
        <TextBox Text="{Binding Partner}" Grid.Column="3"></TextBox> 
       </Grid> 
      </DataTemplate></ListBox.ItemTemplate> 

     </ListBox> 

यह सब ठीक लग रहा है, लेकिन अब स्तंभ 1 और 3 से ऊपर मैं एक हैडर रखना चाहते हैं। क्या कोई मुझे दिखा सकता है कि मैं अपने दो कॉलम में हेडर कैसे जोड़ता हूं।

उत्तर

10

सूची दृश्य है निश्चित रूप से सबसे अच्छा विकल्प, लेकिन, यदि आपको एक सूची बॉक्स का उपयोग करने की आवश्यकता है तो आप इस तरह से सूची बॉक्स के टेम्पलेट को संशोधित कर सकते हैं।

<ListBox Name="lbEurInsuredType" HorizontalContentAlignment="Stretch"> 
     <ListBox.Template> 
      <ControlTemplate> 
       <DockPanel LastChildFill="True"> 
        <Grid DockPanel.Dock="Top" Height="30"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="100"></ColumnDefinition> 
          <ColumnDefinition Width="30"></ColumnDefinition> 
          <ColumnDefinition Width="2"></ColumnDefinition> 
          <ColumnDefinition Width="30"></ColumnDefinition> 
         </Grid.ColumnDefinitions> 
         <Label Grid.Column="0">Column 1</Label> 
         <Label Grid.Column="1">Column 2</Label> 
         <Label Grid.Column="2">Column 3</Label> 
         <Label Grid.Column="3">Column 4</Label> 
        </Grid> 
        <ItemsPresenter></ItemsPresenter> 
       </DockPanel> 
      </ControlTemplate> 
     </ListBox.Template> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid Margin="0,2"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="100"></ColumnDefinition> 
         <ColumnDefinition Width="30"></ColumnDefinition> 
         <ColumnDefinition Width="2"></ColumnDefinition> 
         <ColumnDefinition Width="30"></ColumnDefinition> 
        </Grid.ColumnDefinitions> 
        <TextBlock Text="{Binding Title}"></TextBlock> 
        <TextBox Text="{Binding Uw}" Grid.Column="1"></TextBox> 
        <TextBox Text="{Binding Partner}" Grid.Column="3"></TextBox> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
+0

मैटिया लेकिन आपने स्तंभ चौड़ाई तय की है यदि शीर्षक को और स्थान चाहिए 100px से ??? – dnxit

+1

आप इसे चर बनाने के लिए कॉलमडिफिनिशन पर Grid.IsSharedSizeScope और SharedSizeGroup का उपयोग कर सकते हैं –

0

मैं इस तो वहाँ कोड के साथ कुछ समस्या हो सकती है नहीं चला है, लेकिन यह आप विचार ListBox

<ListBox Name="lbEurInsuredType" HorizontalContentAlignment="Stretch"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid Margin="0,2"> 
       <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="100"></ColumnDefinition> 
        <ColumnDefinition Width="30"></ColumnDefinition> 
        <ColumnDefinition Width="2"></ColumnDefinition> 
        <ColumnDefinition Width="30"></ColumnDefinition> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="Title" ></TextBlock> 
       <TextBlock Text="Uw" Grid.Column="1" ></TextBox> 
       <TextBlock Text="Partner" Grid.Column="3" ></TextBox> 

       <TextBlock Text="{Binding Title}" Grid.Row="1"></TextBlock> 
       <TextBox Text="{Binding Uw}" Grid.Column="1" Grid.Row="1"></TextBox> 
       <TextBox Text="{Binding Partner}" Grid.Column="3" Grid.Row="1"></TextBox> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

मैंने टेक्स्टबॉक्स से लेबल में बदलने के अपवाद के साथ यह कोशिश की है, लेकिन कुछ भी दिखाई नहीं देता है। – bilpor

-1

आप घोंसला एक लेबल कर सकते थे करने के लिए शीर्ष लेख जोड़ने के लिए एक पाठ खंड दे देंगे (या उस मामले में) कॉलम परिभाषाओं में से एक के अंदर और इसके अनुसार शैली।

<ColumnDefinition> 
    <Label Content="Header 1" FontSize="20"/> 
</ColumnDefinition> 
+0

मैंने इस कोशिश की है और Xaml त्रुटियों के साथ 'कॉलमडिफिनिशन प्रकार के किसी ऑब्जेक्ट में सामग्री नहीं जोड़ सकता' – bilpor

+0

मैं इसके बारे में भूल गया, मोहित के जवाब का काम किया? – mistopportunity

3

मेरा सुझाव है कि आप एक ListView बजाय का उपयोग जो आप के लिए अधिक उपयुक्त मामला है, आप एक GridView अंदर का उपयोग करें और कॉलम है कि आप तो जरूरत है निर्धारित कर सकते हैं उन्हें और अधिक आसानी से restyle

<ListView Name="lbEurInsuredType" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}"> 
     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Title}"></TextBlock> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
         <GridViewColumn.Header> 
          <TextBlock Text="Column 1"></TextBlock> 
         </GridViewColumn.Header> 
        </GridViewColumn> 
        <GridViewColumn> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Uw}"></TextBlock> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate>       
        </GridViewColumn> 
        <GridViewColumn> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Partner}"></TextBlock> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
         <GridViewColumn.Header> 
          <TextBlock Text="Column 3"></TextBlock> 
         </GridViewColumn.Header> 
        </GridViewColumn> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View>      
    </ListView> 
+0

मैं एक दृश्य का उपयोग नहीं कर सकता क्योंकि मुझे टेक्स्टबॉक्स का उपयोग करने की आवश्यकता है ताकि उपयोगकर्ता कुछ डिफ़ॉल्ट मान बदल सके। – bilpor

+0

मुझे नहीं पता कि समस्या कहां है? आपके उदाहरण में – Usama

+0

आपने टेक्स्टबॉक्स में अपने टेक्स्टबॉक्स बदल दिए हैं। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह एक सूची दृश्य है (मैं wpf के लिए नया हूँ)। लेकिन मुझे उपयोगकर्ता को डेटा बदलने की अनुमति देने की आवश्यकता है। मैंने मैटिया के जवाब का इस्तेमाल किया है और काम करना प्रतीत होता है। – bilpor

0

भी लिस्टबॉक्स

<Grid Style="{StaticResource TableHeader}"> 
     <Grid.Resources> 
      <Style TargetType="{x:Type Border}" BasedOn="{StaticResource TableBorder}"/> 
      <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextTableHeader}"> 
       <Setter Property="TextWrapping" Value="Wrap"/> 
      </Style> 
     </Grid.Resources> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Border BorderThickness="1"> 
      <TextBlock Text="Card"/> 
     </Border> 

     <Border Grid.Column="1" BorderThickness="0 1 1 1"> 
      <TextBlock Text="Type"/> 
     </Border> 

     <Border Grid.Column="2" BorderThickness="0 1 1 1"> 
      <TextBlock Text="Limit"/> 
     </Border> 

     <Border Grid.Column="3" BorderThickness="0 1 1 1"> 
      <TextBlock Text="Amount"/> 
     </Border> 

     <Border Grid.Column="4" BorderThickness="0 1 1 1"> 
      <TextBlock Text="Payment Due"/> 
     </Border> 

    </Grid> 

    <ListBox Style="{StaticResource ListBoxStyle}" 
      ItemsSource="{Binding Source}" 
      SelectedItem="{Binding SelectedItem}" 
      IsHitTestVisible="{Binding IsSelectionActive}" 
      ItemTemplate="{Binding ItemTemplate}" /> 
</Grid> 
0

ListBox कोई HeaderTemplate है गतिशील डेटा टेम्पलेट के साथ एक उपयोगकर्ता नियंत्रण के अंदर हो सकता है। ListView सबसे अच्छा विकल्प नहीं है क्योंकि यह Width="*" का समर्थन नहीं करता है। यदि आप बेताब हो जाते हैं और DataGrid पर जाते हैं तो आपको अपनी आवश्यकता से बहुत अधिक मिल रहा है। समाधान HeaderedItemsControl

बस उस संग्रह का नाम बदलें जिसे आप बाध्यकारी कर रहे हैं और बाध्यकारी गुणों को बदल सकते हैं।

<!-- actual XAML --> 
     <HeaderedItemsControl 

                ItemTemplate="{DynamicResource CorrugationItemTemplate}" 
                ItemsSource="{Binding CorrugationItemCollection}" 
                Style="{DynamicResource CorrugationStyle}"/> 


    <!-- this goes in the resource dict --> 

     <DataTemplate x:Key="CorrugationItemTemplate"> 
      <Grid Width="Auto" Background="#e1e1e1"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="60"/> 
        <ColumnDefinition Width="60"/> 
        <ColumnDefinition Width="60"/> 
        <ColumnDefinition Width="60"/> 
       </Grid.ColumnDefinitions> 
       <Border Grid.Column="0" Background="Lime" > 
        <Label Content="{Binding RangeLabel}" /> 
       </Border> 
       <Border Grid.Column="1" Background="Orange" > 
        <Label Content="{Binding LeftPreGrind}" /> 
       </Border> 
       <Border Grid.Column="2" Background="Lime" > 
        <Label Content="{Binding RightPreGrind}" /> 
       </Border> 
       <Border Grid.Column="3" Background="Orange" > 
        <Label Content="{Binding LeftPostGrind}" /> 
       </Border> 
       <Border Grid.Column="4" Background="Lime" > 
        <Label Content="{Binding RightPostGrind}" /> 
       </Border> 
      </Grid> 
     </DataTemplate> 

     <Style TargetType="{x:Type HeaderedItemsControl}" x:Key="CorrugationStyle"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type HeaderedItemsControl}"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*"/> 
           <ColumnDefinition Width="60"/> 
           <ColumnDefinition Width="60"/> 
           <ColumnDefinition Width="60"/> 
           <ColumnDefinition Width="60"/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="20pt"/> 
           <RowDefinition Height="4*"/> 
          </Grid.RowDefinitions> 

          <Border Grid.Column="0" Background="Orange" > 
           <Label Content="Range" /> 
          </Border> 
          <Border Grid.Column="1" Background="Lime" > 
           <Label Content="LeftPreGrind" /> 
          </Border> 
          <Border Grid.Column="2" Background="Orange" > 
           <Label Content="RightPreGrind" /> 
          </Border> 
          <Border Grid.Column="3" Background="Lime" > 
           <Label Content="LeftPostGrind" /> 
          </Border> 
          <Border Grid.Column="4" Background="Orange" > 
           <Label Content="RightPostGrind" /> 
          </Border> 




          <Grid Grid.Row="1" Grid.ColumnSpan="5" Width="Auto" Height="Auto" Background="White"> 
           <ItemsPresenter/> 
          </Grid> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
संबंधित मुद्दे