2017-08-29 9 views
0

TabControlObservableCollectionにバインドされ、自分のタブを正しく作成します。XAMLを使用してWPF TabControl内でコントロールを追加する方法

<Window x:Class="BA_Auditing.AuditWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="BizeAsset - Audit Results" Height="700" Width="1120" WindowStartupLocation="CenterScreen" WindowState="Maximized"> 
    <Grid> 
     <TabControl Name="ModuleTabControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5" ItemsSource="{Binding}" > 
      <TabControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock>        
         <TextBlock Text="{Binding DISPLAY_NAME}"/> 
        </TextBlock> 
       </DataTemplate> 
      </TabControl.ItemTemplate> 

      <TabControl.ContentTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition /> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition /> 
         </Grid.RowDefinitions> 
         <Grid Grid.Row="0"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition /> 
           <ColumnDefinition /> 
          </Grid.ColumnDefinitions> 
          <TextBlock Grid.Column="0" Text="Search:" HorizontalAlignment="Right"/> 
          <TextBox x:Name="tbxSearch" Grid.Column="1"/> 
         </Grid> 
         <TextBlock Grid.Row="2" Text="Items Selected: 0 of 908" /> 
        </Grid> 
       </DataTemplate> 
      </TabControl.ContentTemplate> 
     </TabControl> 
    </Grid> 
</Window> 

次私はLabelTextBoxTabControlTextBlockが含まれる、コントロールの次のレベルで各タブ領域を移植したいと思います。

は、私が以前WinFormsでこれを書いたし、これは次のようになります。

enter image description here

XAML私はこれを行うために追加する必要はありますか?私は結合を経由して、動的にそれを設計するのではなく、文字通りTabItem

を追加していているので
[EDIT]
私はのTabItemの体内でTabControl.ContentTemplateしかし、何も表示さにコントロールを入力しようとしました。
enter image description here

答えて

2

私はあなたが"WW - Wastewater"タブの「クリック」していた場合は、生成された何か(検索ボックスなど)を見ていると思います - タブがデフォルトで選択されていなかったためです。

とにかく、ここには、あなたが望むものに少し近づくコードがあります。ちょうどあなたを始めようとするときに、他の配管コード(変更通知など)を追加する必要があります。

「サービス」タブなどには何を持っているのか分かりません。同じように「アセット」として扱えるかどうかはわかりません。また、グリッド列の名前を明示的に定義するのではなく、自動的に生成されるようにすることもできます。他にもいくつかの手法があります。

enter image description here

<Window x:Class="WpfApp38.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApp38" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TabControl Name="ModuleTabControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5" ItemsSource="{Binding}" SelectedIndex="0" > 
      <TabControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock>        
         <TextBlock Text="{Binding DISPLAY_NAME}"/> 
        </TextBlock> 
       </DataTemplate> 
      </TabControl.ItemTemplate> 

      <TabControl.ContentTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="*" /> 
          <RowDefinition Height="Auto"/> 
         </Grid.RowDefinitions> 
          <Grid Grid.Row="0"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition /> 
            <ColumnDefinition /> 
           </Grid.ColumnDefinitions> 
           <TextBlock Grid.Column="0" Text="Search:" HorizontalAlignment="Right"/> 
           <TextBox x:Name="tbxSearch" Grid.Column="1"/> 
          </Grid> 
         <TabControl Grid.Row="1" ItemsSource="{Binding SubCategories}"> 
          <TabControl.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding DISPLAY_NAME}"/> 
           </DataTemplate> 
          </TabControl.ItemTemplate> 
          <TabControl.ContentTemplate> 
           <ItemContainerTemplate> 
            <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Assets}"> 
            </DataGrid> 
           </ItemContainerTemplate> 
          </TabControl.ContentTemplate> 
         </TabControl> 
         <TextBlock Grid.Row="2" Text="Items Selected: 0 of 908" /> 
        </Grid> 
       </DataTemplate> 
      </TabControl.ContentTemplate> 
     </TabControl> 
    </Grid> 
</Window> 

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApp38 
{ 
    public class InfrastructureCateogry 
    { 
     public string DISPLAY_NAME { get; set; } 

     public ObservableCollection<AssetCategory> SubCategories { get; set; } 
    } 

    public class AssetCategory 
    { 
     public string DISPLAY_NAME { get; set; } 

     public ObservableCollection<AssetRecord> Assets { get; set; } 
    } 

    public class AssetRecord 
    { 
     public string AssetID { get; set; } // make it an int 
     public string AssetType { get; set; } 
     public string LastUpdateBy { get; set; } // make this a DateTime object 
     public string LastUpdateDate { get; set; } // make this a DateTime object 
    } 

    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private ObservableCollection<InfrastructureCateogry> infrastructurecategories = new ObservableCollection<InfrastructureCateogry>(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      var x = new InfrastructureCateogry() 
      { 
       DISPLAY_NAME = "AR - Roads and Bridges", 
       SubCategories = new ObservableCollection<AssetCategory> 
       { 
        new AssetCategory 
        { 
         DISPLAY_NAME = "Lines", 
         Assets = new ObservableCollection<AssetRecord> 
         { 
          new AssetRecord 
          { 
           AssetID = "20040927104600", 
           AssetType = "Gravity Main", 
           LastUpdateDate = "07/05/2015 17:01:55 PM" 
          }, 
          new AssetRecord 
          { 
           AssetID = "20150507170116", 
           AssetType = "Relined", 
           LastUpdateDate = "07/05/2015 17:01:15 PM" 
          } 
         } 
        }, 
        new AssetCategory 
        { 
         DISPLAY_NAME = "Points" 
        }, 
        new AssetCategory 
        { 
         DISPLAY_NAME = "Plant/Components" 
        }, 
        new AssetCategory 
        { 
         DISPLAY_NAME = "Services" 
        } 
       } 
      }; 

      infrastructurecategories.Add(x); 

      var x2 = new InfrastructureCateogry(); 
      x2.DISPLAY_NAME = "WW - WasteWater"; 

      infrastructurecategories.Add(x2); 

      this.DataContext = infrastructurecategories; 
     } 
    } 
} 
+0

さて私は、なぜ私はちょうどヘクタールそれをクリックしませんでした...少し愚かな感じ! XAMLでデフォルトで最初のタブを選択する方法を知らないとします。ウィンドウ内に最初のインタラクティブコントロールを適切に表示しないのはちょっと奇妙です。 – Hank

+0

TabControlのSelectedIndex = "0" –

+0

ありがとうございます! – Hank

関連する問題