2016-04-26 2 views
2

J'ai créé un DataGrid wpf qui est invoqué à partir d'une liste de noms de fichiers et de leur score. La grille fonctionne très bien, et maintenant j'essaie de le rendre disponible pour l'utilisateur de cliquer sur une ligne et il révèle le contenu du fichier lui-même (fichiers texte). La chaîne de texte est très grande et par conséquent je ne veux pas que ce soit un attribut de la liste. Au lieu de cela, je veux que le chemin du fichier soit l'attribut et un streamer lira le fichier chaque fois que je clique sur une ligne.Ajout de détails de ligne à DataGrid dans XAML

Je code dans C#. Ceci est mon code (partiel) jusqu'à présent:

public class DataLeakageScorer 
{ 
    public string fileName { get; set; } 
    public string score { get; set; } 
    public string path { get; set; } 

    public DataLeakageScorer(string fileName, string score, string path) 
    { 
     this.fileName = fileName; 
     this.score = score; 
     this.path = path; 
    } 
} 

et mon XAML:

<Grid> 
    <Button x:Name="button" Content="Browse" HorizontalAlignment="Left" Margin="464,22,0,0" VerticalAlignment="Top" Width="75" Click="browse"/> 
    <Label x:Name="status" Content="Please select a folder" FontSize="15" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" Margin="0,5,121,0" VerticalAlignment="Top" Width="459" Height="52"/> 
    <DataGrid Name="scoresTable" AutoGenerateColumns="False" IsReadOnly="True" CanUserSortColumns="False" Margin="0,62,0,0"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="File Name" Binding="{Binding fileName}"/> 
      <DataGridTextColumn Header="Score" Binding="{Binding score}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

Merci et désolé si je n'étais pas assez clair

Répondre

0

Here you have the answer. est rangée Détails sur la partie blog la chose dont vous avez besoin? Au début, vous devez créer un comportement personnalisé attaché à votre DataGrid. Appelons-le par exemple ReadFileBehavior.

Il doit s'abonner à l'événement RowDetailsVisibilityChanged lors de la connexion au DataGrid.

public class ReadFileBehavior : Behavior<DataGrid> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     this.AssociatedObject.RowDetailsVisibilityChanged += OnRowDetailsVisibilityChanged; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     this.AssociatedObject.RowDetailsVisibilityChanged -= OnRowDetailsVisibilityChanged; 
    } 

    private void OnRowDetailsVisibilityChanged(object sender, DataGridRowDetailsEventArgs e) 
    { 
     var element = e.DetailsElement as TextBlock; 
     element.Text = File.ReadAllLines((element.DataContext as DataLeakageScorer).Path); 
    } 
} 

Que vous pouvez ajouter le comportement à votre DataGrid en XAML:

 <DataGrid ItemsSource="{Binding Customers}"> 
      <Interactivity:Interaction.Behaviors> 
       <customBehaviors:ReadFileBehavior /> 
      </Interactivity:Interaction.Behaviors> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" /> 
      </DataGrid.Columns> 
      <DataGrid.RowDetailsTemplate> 
       <DataTemplate> 
        <TextBlock /> 
       </DataTemplate> 
      </DataGrid.RowDetailsTemplate> 
     </DataGrid> 

Je ne l'ai pas testé cette solution, mais il peut être neccessary d'ajouter l'héritage BindableBase à DataLeakageScorer (ou mettre en œuvre INotifyPropertyChanged) parce que vous ne pouvez pas avoir accès à la propriété TextBlock.Text. Que vous feriez juste quelque chose comme ceci:

private void OnRowDetailsVisibilityChanged(object sender, DataGridRowDetailsEventArgs e) 
    { 
     var context = e.DetailsElement.DataContext as DataLeakageScorer 
     context.Score = File.ReadAllLines(context.Path); 
    } 
+0

J'ai déjà vu cela et malheureusement ce n'est pas la réponse à ma question. D'après ce que j'ai compris de cela, les images sont des attributs de costumiers et comme je l'ai dit, je ne veux pas que ma chaîne soit celle-là. –

+0

J'ai modifié la réponse. Ce n'est qu'une esquisse de la façon dont vous pouvez résoudre votre problème. :) J'espère que ça va aider! – mikes