2016-05-02 14 views
0

MVVMパターンとTabControlへのバインディングのほとんどを調べるのに10時間以上を費やしました。MVVM LIKEはTabItemの1つのビューをバインドできません

私は私の実際のコードを与えていないことを好むが、私の問題は少し簡単です

  • 私はインポート/エクスポートIDE(インフォマティカのデータ交換)の記事

  • 私は」にアプリケーションを開発していますすべてのモデルクラスを含む完全なDLLを作成しました(クライアントはそのクラスを別のアプリケーションで使用する必要がありました)。これにはEFエンティティ(テーブルではなくストアドプロシージャの形式)が含まれています

  • 私はIndexMaiを持っていますnViewModelと関連付けられたApp.Ressourcesのビューには、VとVMをバインドするDataTemplateが定義されており、2つのタブが含まれます。

  • これらの各タブには、ExportViewModelに関連するExportViewと、同じBuidingスタイルでのImportViewという2つのビューが表示される必要があります。

    情報について

:私はすべての私のモデルとWorkClassesが含まれているDLLを作成しました、私はそれならば謝罪

(私のサービスを含め、私もそこのインターフェイスでDAOlayoutを作成し、すべてが素晴らしいです)はっきりしない。必要なら私のコードを書き留めます。

どのような簡単なアイデアでも大歓迎です。

ありがとうございました。

+0

問題は不明です。各タブクリック後にUIを読み込む問題に直面していますか? @RizzCandy –

+0

実際には何も表示されません。アプリケーションの開始時に、IndexMainViewがTabControlで初期化されています。最初のタブにExportViewを表示し、2番目のタブにImportViewを表示するはずです。 – RizzCandy

答えて

0

私は自分自身で答えに達しました。私はxamlコードのビューバインディングについて混乱していました。私はこれを単にそれを考え出した:

ビュー:

<TabControl ItemsSource="{Binding Views}"> 
    <TabControl.ItemTemplate > 
     <!-- header template --> 
     <DataTemplate> 
      <TextBlock Text="{Binding Header}" /> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <!--content template--> 
     <DataTemplate> 
      <views:ExportView/> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

のViewModelを:

public sealed class IndexMainViewModel : ViewModelBase 
{ 

    private ObservableCollection<TabItem> _views; 

    public ObservableCollection<TabItem> Views 
    { 
     get { return _views; } 
     set 
     { 
      _views = value; 
      RaisePropertyChanged(() => Views); 
     } 
    } 
    public IndexMainViewModel() 
    { 
     _views = new ObservableCollection<TabItem>(); 
     _views.Add(new TabItem { Header = "Export", Content = new ExportViewModel()}); 
     _views.Add(new TabItem { Header = "Import", Content = new ImportViewModel()}); 
    } 
} 

は私もViewModelBaseオブジェクト(MVVMライトクラスのオブジェクト)をTabItemクラスを作成しました。 xamlコード内でネームスペース<views:ExportView/>が見つからない場合、この観察可能なビューのコレクションを表示できます。

0

デザインパートでは、2つのTabを作成します.1つはアップロードで、もう1つはダウンロードです。

<UserControl.Resources> 
     <Style TargetType="TabItem" x:Key="MainTabItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="TabItem"> 
         <DockPanel Height="45" Width="245" > 
          <Separator Name="RightBorder" Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" 
            Height="30" DockPanel.Dock="Right" /> 
          <Grid Cursor="Hand" Width="245" Background="Transparent" > 
           <TextBlock Name="TabItemTitle" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" 

          </Grid> 
          <ContentPresenter ContentSource="Header"/> 
         </DockPanel> 

         <ControlTemplate.Triggers> 
          <Trigger Property="Name" Value="UploadTab"> 
           <Setter TargetName="TabItemTitle" Property="Text" Value="Upload"/> 
          </Trigger> 
          <Trigger Property="Name" Value="DownloadTab"> 
           <Setter TargetName="TabItemTitle" Property="Text" Value="Download"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </UserControl.Resources> 

    <Grid HorizontalAlignment="Center" Background="White"> 
      <TabControl Name="MediaControl" SelectionChanged="TabControl_SelectionChanged" Padding="0"> 
      <TabItem Name="UploadTab" Style="{StaticResource MainTabItem}"> 
       <Border Name="UploadTabPanel"> 
        </Border> 
       </TabItem> 
       <TabItem Name="DownloadTab" Style="{StaticResource MainTabItem}"> 
       <Border x:Name="DownloadTabPanel"> 
        </Border> 
       </TabItem> 
      </TabControl> 
    </Grid> 
</UserControl> 

TabクリックSelectionChanged eventSelectionChanged event .IN Borderの子として解雇とTabItemの下であなたのUIが表示されます後、あなたはUIパートを追加する必要があります...

  private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
      { 
       try 
       { 
        string tabItem = ((sender as TabControl).SelectedItem as TabItem).Name as string; 
        switch (tabItem) 
        { 
         case "UploadTab": 
          if (UploadInstance == null) 
          { 
           UploadInstance = new UploadInstance(); 
          } 
          UploadTabPanel.Child = UploadInstance; 
          break; 
         case "DownloadTab": 
          if (DownloadInstance == null) 
          { 
           DownloadInstance = new DownloadInstance(); 
          } 
          DownloadTabPanel.Child = DownloadInstance; 
          break; 
        } 
       } 
       catch (System.Exception ex) { } 
      } 
関連する問題