2009-11-24 14 views
0

J'ai un onglet avec 2 onglets. le contenu de chaque onglet est lié à ListCollectionView et le modèle de données a une grille montrant les éléments. Le problème est que si vous cliquez sur l'une des colonnes pour trier, si je sélectionne l'autre onglet et que je reviens au premier onglet, le tri est effacé. Est-ce un bug connu?WPF Toolkit Datagrid Bogue

Voici le code:

<Window x:Class="WpfApplication3.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit" 
Title="Window1" Height="538" Width="1223"> 
<Window.Resources> 
    <DataTemplate x:Key="TestTemplate"> 
     <toolkit:DataGrid ItemsSource="{Binding}" AutoGenerateColumns="false" IsReadOnly="True" > 
      <toolkit:DataGrid.Columns> 
       <toolkit:DataGridTextColumn Binding="{Binding IntVal}" Header="Number"></toolkit:DataGridTextColumn> 
       <toolkit:DataGridTextColumn Binding="{Binding StringVal}" Header="String"></toolkit:DataGridTextColumn> 
      </toolkit:DataGrid.Columns> 
     </toolkit:DataGrid> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 
    <TabControl> 
     <TabItem Header="tab1" ContentTemplate="{StaticResource TestTemplate}" x:Name="a" Content="{Binding}"/> 
     <TabItem Header="tab2" ContentTemplate="{StaticResource TestTemplate}" x:Name="b" Content="{Binding}"/> 
    </TabControl> 
</Grid> 

Code

behid:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     List<test> intt = new List<test> 
     { 
      new test { IntVal = 5, StringVal = "abc" }, 
      new test { IntVal = 12, StringVal = "cc" }, 
      new test { IntVal = 2, StringVal = "sdgc" }, 
      new test{IntVal=64,StringVal="df"}, 
      new test{IntVal=1234,StringVal="werw"}, 
      new test{IntVal=14,StringVal="sdvvd"}, 
      new test{IntVal=136,StringVal="aasr"} 
     }; 

     List<test> intt2 = new List<test> 
     { 
      new test { IntVal = 5, StringVal = "abc" }, 
      new test { IntVal = 12, StringVal = "cc" }, 
      new test { IntVal = 2, StringVal = "sdgc" }, 
      new test{IntVal=64,StringVal="df"}, 
      new test{IntVal=1234,StringVal="werw"}, 
      new test{IntVal=14,StringVal="sdvvd"}, 
      new test{IntVal=136,StringVal="aasr"} 
     }; 

     this.a.DataContext = new ListCollectionView(intt); 
     this.b.DataContext = new ListCollectionView(intt2); 
    } 

    public class test 
    { 
     public int IntVal { get; set; } 
     public string StringVal { get; set; } 
    } 
} 

Répondre

0

Je pense que le TabControl détruire et recréer son enfant chaque fois que vous changez l'onglet sélectionné. Cela expliquerait pourquoi le tri n'est pas gardé.

Vous pouvez consulter la section this discussion du groupe Google Disciples de WPF pour obtenir des informations sur la façon de résoudre ce problème.

+0

Merci Je vais lui donner un essai et voir si ça aide. Bien que cela fonctionne lorsque vous codez le DataGrid dans l'onglet. Je suppose que l'onglet crée tout à partir de zéro seulement si vous utilisez un modèle –

0

J'avais rencontré un problème similaire. Je pense que wpf utilise le même contentpresenter pour les modèles de données. Dans votre cas, l'instance de la grille de données est la même, seules les données sont rebondies lorsque vous changez d'onglet. Ce que j'ai fait était de créer une instance du contrôle dans codebehind et le définir comme une propriété de contenu du TabItem. par exemple

TabItem ti = new TabItem(); 
ti.DataContext = intt; 
ti.Content = new DataGrid(); 
myTabControl.Items.Add(t); 

espérons que cette aide ..