2013-03-04 195 views
1

我有一个tab-control三个选项卡项目。每个标签项目都有一个datagrid放置在它上面。 ,所有这三个数据网格在它们各自的选项卡上都是Master-Detail-SubDetail形式。如何在WPF中从一个tabitem移动到另一个tabitem

当用户选择主数据网格上的一行时,如何从第一个选项卡项目移动到第二个选项卡项目?我使用ADO.Net实体框架创建了一个模型来创建此主 - 细节视图。

XAML布局

<TabControl Height="270" HorizontalAlignment="Left" Margin="16,23,0,0" Name="tabControl1" VerticalAlignment="Top" Width="462"> 
     <TabItem Header="Person" Name="tabItem1"> 
      <Grid DataContext="{StaticResource peopleViewSource}"> 
       <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="166" SelectedItem="{Binding personDetails}" 
          HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="64,23,0,0" Name="peopleDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="289"> 
        <DataGrid.Columns> 
         <DataGridTextColumn x:Name="personIDColumn" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" /> 
         <DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="first Name" Width="SizeToHeader" /> 
         <DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=lastName}" Header="last Name" Width="SizeToHeader" /> 
        </DataGrid.Columns> 
       </DataGrid> 
      </Grid> 
     </TabItem> 
     <TabItem Header="Person Details" Name="tabItem2"> 
      <Grid DataContext="{StaticResource peoplepersonDetailsViewSource}"> 
       <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="120" SelectedItem="{Binding personDetails.personStatus}" 
          HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="82,18,0,0" Name="personDetailsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="172"> 
        <DataGrid.Columns> 
         <DataGridTextColumn x:Name="detailIDColumn" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" /> 
         <DataGridTextColumn x:Name="positionColumn" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" /> 
         <DataGridTextColumn x:Name="personIDColumn1" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" /> 
        </DataGrid.Columns> 
       </DataGrid> 
      </Grid> 
     </TabItem> 
     <TabItem Header="Person Status" Name="tabItem3"> 
      <Grid DataContext="{StaticResource peoplepersonDetailspersonStatusViewSource}"> 
       <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="143" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="91,23,0,0" Name="personStatusDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="185"> 
        <DataGrid.Columns> 
         <DataGridTextColumn x:Name="detailIDColumn1" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" /> 
         <DataGridTextColumn x:Name="positionColumn1" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" /> 
         <DataGridTextColumn x:Name="statussColumn" Binding="{Binding Path=statuss}" Header="statuss" Width="SizeToHeader" /> 
        </DataGrid.Columns> 
       </DataGrid> 
      </Grid> 
     </TabItem> 
    </TabControl> 

tab item 1

tab item 2

+2

我感觉到一个完全缺乏MVVM这里... – 2013-03-04 21:45:32

+1

看看[这里](http://stackoverflow.com/questions/15209870/dynamically-updating-tabcontrol-content-at-runtime/15210593# 15210593)对TabControl真的是什么的解释... – 2013-03-04 21:46:38

+0

没有没有MVVM的WPF ...如果你尝试以WinForms的方式使用WPF,你会遭受很大的损失。 – 2013-03-04 21:47:07

回答

1

,你可以设置在DataGridSelectionChanged事件EventTrigger

因为EventTrigger只有allowa动画,你可以设置一个Int32AnimationUsingKeyFrames动画变化TabControlSelectedIndex

触发

<DataGrid.Triggers> 
    <EventTrigger RoutedEvent="DataGrid.SelectionChanged" > // SelectionChanged Event 
     <BeginStoryboard> 
      <Storyboard > 
       <Int32AnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="tabControl1" Storyboard.TargetProperty="SelectedIndex"> // set target control and target property 
        <SplineInt32KeyFrame KeyTime="00:00:00" Value="1"/> // Value = TabControl Selected index you want to show 
       </Int32AnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</DataGrid.Triggers> 

下面是一个例子:

<TabControl Height="270" HorizontalAlignment="Left" Margin="16,23,0,0" Name="tabControl1" VerticalAlignment="Top" Width="462"> 
     <TabItem Header="Person" Name="tabItem1"> 
      <Grid DataContext="{StaticResource peopleViewSource}"> 
       <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="166" SelectedItem="{Binding personDetails}" 
          HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="64,23,0,0" Name="peopleDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="289"> 
        <DataGrid.Columns> 
         <DataGridTextColumn x:Name="personIDColumn" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" /> 
         <DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="first Name" Width="SizeToHeader" /> 
         <DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=lastName}" Header="last Name" Width="SizeToHeader" /> 
        </DataGrid.Columns> 
         <DataGrid.Triggers> 
          <EventTrigger RoutedEvent="DataGrid.SelectionChanged" > 
           <BeginStoryboard> 
            <Storyboard > 
             <Int32AnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="tabControl1" Storyboard.TargetProperty="SelectedIndex"> 
              <SplineInt32KeyFrame KeyTime="00:00:00" Value="1"/> 
             </Int32AnimationUsingKeyFrames> 
            </Storyboard> 
           </BeginStoryboard> 
          </EventTrigger> 
         </DataGrid.Triggers> 
       </DataGrid> 
      </Grid> 
     </TabItem> 
    ...... 

这里是我的样机

代码:

namespace WpfApplication7 
{ 
    public partial class MainWindow : Window 
    { 

     private Person _selectedPerson; 
     private ObservableCollection<Person> _persons = new ObservableCollection<Person>(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
      Items.Add(new Person { personID = "Stack" }); 
      Items.Add(new Person { personID = "Overflow" }); 
     } 

     public ObservableCollection<Person> Items 
     { 
      get { return _persons; } 
      set { _persons = value; } 
     } 

     public Person SelectedPerson 
     { 
      get { return _selectedPerson; } 
      set { _selectedPerson = value; } 
     } 

    } 

    public class Person 
    { 
     public string personID { get; set; } 
     public string firstname { get; set; } 
     public string lastname { get; set; } 
    } 
} 

的XAML:

<Window x:Class="WpfApplication7.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="399" Width="464" Name="UI" > 

    <Grid> 
     <TabControl Height="270" HorizontalAlignment="Left" Margin="16,23,0,0" Name="tabControl1" VerticalAlignment="Top" Width="462"> 
      <TabItem Header="Person" Name="tabItem1"> 
       <Grid DataContext="{Binding ElementName=UI, Path=Items}" > 
        <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="166" SelectedItem="{Binding personDetails}" 
          HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="64,23,0,0" Name="peopleDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="289"> 
         <DataGrid.Columns> 
          <DataGridTextColumn x:Name="personIDColumn" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" /> 
          <DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="first Name" Width="SizeToHeader" /> 
          <DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=lastName}" Header="last Name" Width="SizeToHeader" /> 
         </DataGrid.Columns> 
         <DataGrid.Triggers> 
          <EventTrigger RoutedEvent="DataGrid.SelectionChanged" > 
           <BeginStoryboard> 
            <Storyboard > 
             <Int32AnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="tabControl1" Storyboard.TargetProperty="SelectedIndex"> 
              <SplineInt32KeyFrame KeyTime="00:00:00" Value="1"/> 
             </Int32AnimationUsingKeyFrames> 
            </Storyboard> 
           </BeginStoryboard> 
          </EventTrigger> 
         </DataGrid.Triggers> 
        </DataGrid> 
       </Grid> 
      </TabItem> 
      <TabItem Header="Person Details" Name="tabItem2"> 
       <Grid> 
        <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="120" SelectedItem="{Binding personDetails.personStatus}" 
          HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="82,18,0,0" Name="personDetailsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="172"> 
         <DataGrid.Columns> 
          <DataGridTextColumn x:Name="detailIDColumn" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" /> 
          <DataGridTextColumn x:Name="positionColumn" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" /> 
          <DataGridTextColumn x:Name="personIDColumn1" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" /> 
         </DataGrid.Columns> 
        </DataGrid> 
       </Grid> 
      </TabItem> 
      <TabItem Header="Person Status" Name="tabItem3"> 
       <Grid> 
        <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="143" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="91,23,0,0" Name="personStatusDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="185"> 
         <DataGrid.Columns> 
          <DataGridTextColumn x:Name="detailIDColumn1" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" /> 
          <DataGridTextColumn x:Name="positionColumn1" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" /> 
          <DataGridTextColumn x:Name="statussColumn" Binding="{Binding Path=statuss}" Header="statuss" Width="SizeToHeader" /> 
         </DataGrid.Columns> 
        </DataGrid> 
       </Grid> 
      </TabItem> 
     </TabControl> 
    </Grid> 
</Window> 
+0

感谢您的回复..但我有一个错误说 - “一个未处理的类型'System.InvalidCastException'的异常发生PresentationFramework.dll 其他信息:指定的转换无效。“ – user1221765 2013-03-04 23:29:00

+0

它在这里工作正常,我添加了我用来测试这个'触发器'的样机应用程序,这样你就可以在你的应用程序 – 2013-03-04 23:38:54

+0

以外测试了。非常感谢:)再多一个问题,它是否没有代码为routedevent? – user1221765 2013-03-04 23:39:41