none
DataGrid如何激活 RRS feed

  • 问题

  • 用WPF的DataGrid,如果将DataGrid放在一个tab中,当对应的tab没有被选中的时候,DataGrid就没有被加载,即此时

    DataGrid dg;

    dg.IsLoaded的值是False

    这样的话,虽然给dg中绑了数据,但此时dg的Columns数据还是Count为0,无法被外界调用,一定要选中对应的tab的时候,此时

    dg.IsLoaded才能变为True

    有没有办法让直接让datagrid被加载呢

    2012年6月13日 15:43

答案

  • 因为TabControl的特殊性,在当前显示的那个TabItem会加载,当前还未被选中过,则不会。TabControl同时只有一个TabItem的content是被显示的。

    你可以将你的DataGrid放在TabControl外面,然后设置他的 Visibility="Hidden" , 在你选中你要显示DataGrid的TabItem的时候,将这个DataGrid从外面的Panel中Remove,加入到你的TabItem中的Panel中:

      <Grid>
        <DataGrid Visibility="Hidden" x:Name="dg" ItemsSource="{Binding ...}"/>
        <TabControl SelectionChanged="TabControl_SelectionChanged">
          <TabItem Header="First"/>
          <TabItem x:Name="tabitem2" Header="Second">
            <Grid x:Name="tabItemGrid"></Grid>
          </TabItem>
        </TabControl>
      </Grid>

    C#:
        private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
          if (tabitem2.IsSelected && (dg.Parent as Grid) != tabItemGrid)
          {
            (dg.Parent as Grid).Children.Remove(dg);
            tabItemGrid.Children.Add(dg);
            dg.Visibility = System.Windows.Visibility.Visible;
          }
        }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 wanto_com 2012年6月18日 16:01
    2012年6月14日 2:51
    版主

全部回复

  • 先让这个Tab通过代码被选中一次,然后再选回来就可以了。

    TabItem.IsSelected = true; 则可以让他被选中。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月14日 2:38
    版主
  • 因为TabControl的特殊性,在当前显示的那个TabItem会加载,当前还未被选中过,则不会。TabControl同时只有一个TabItem的content是被显示的。

    你可以将你的DataGrid放在TabControl外面,然后设置他的 Visibility="Hidden" , 在你选中你要显示DataGrid的TabItem的时候,将这个DataGrid从外面的Panel中Remove,加入到你的TabItem中的Panel中:

      <Grid>
        <DataGrid Visibility="Hidden" x:Name="dg" ItemsSource="{Binding ...}"/>
        <TabControl SelectionChanged="TabControl_SelectionChanged">
          <TabItem Header="First"/>
          <TabItem x:Name="tabitem2" Header="Second">
            <Grid x:Name="tabItemGrid"></Grid>
          </TabItem>
        </TabControl>
      </Grid>

    C#:
        private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
          if (tabitem2.IsSelected && (dg.Parent as Grid) != tabItemGrid)
          {
            (dg.Parent as Grid).Children.Remove(dg);
            tabItemGrid.Children.Add(dg);
            dg.Visibility = System.Windows.Visibility.Visible;
          }
        }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 wanto_com 2012年6月18日 16:01
    2012年6月14日 2:51
    版主
  • 虽然我在调用TabItem内的datagrid的相关属性前先执行了tabitem.IsSelected = true,但还是编译到调用属性那一步就挂了。


    2012年6月14日 15:20
  • 那试试看我的那个解决方式,先隐藏DataGrid让其加载 ,然后再将DataGrid移到TabITem中。

    tabitem.IsSelected = true 并不意味内容已经呈现,内容呈现会在这个属性设置后的方法结束后执行。所以你可先 tabitem.IsSelected = true 然后在这个tabitem的Loaded事件中处理你的DataGrid.


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月15日 7:57
    版主