2010-12-09 3 views
1

J'ai un objet DataGrid lié à un objet (en utilisant le modèle MVVM).Définition des propriétés de ligne pour une grille de données liée aux données

<DataGrid ItemsSource="{Binding Path=RecordSet}" 
      AutoGenerateColumns="False" 
      IsReadOnly="True" 
      Name="ResultGrid"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ID" Binding="{Binding Path=Id}" Width="Auto"/> 
     <DataGridTextColumn Header="Foo" Binding="{Binding Path=Foo}" Width="*"/> 
    </DataGrid.Columns> 
</DataGrid> 

ici:

RecordSet is a List<Record>. 

Cela fonctionne très bien. Les données se chargent bien et tout. Je voulais savoir s'il me restait à définir certaines propriétés sur des lignes individuelles, c'est-à-dire à lier une propriété de ligne à une valeur dans mon ViewModel (définissez Row.IsEnable chaque ligne en fonction de Record.Enable) Je suis un débutant à WPF.

Merci

Répondre

3

Cela devrait fonctionner. Mettez ce style dans votre DataGrid.

<DataGrid.RowStyle>     
      <Style TargetType="DataGridRow">  
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=Enabled}" Value="false"> 
         <Setter Property="Visibility" Value="Hidden"/> 
         <Setter Property="Height" Value="0"/> 
        </DataTrigger>       
       </Style.Triggers> 
      </Style> 
     </DataGrid.RowStyle> 

Ceci rendra une ligne invisble et n'aura pas de hauteur si l'enregistrement lié à cette ligne n'est pas activé. La propriété Enabled dans le "{Binding Path = Enabled}" appartient à votre enregistrement. Je ne sais pas si tu l'as déjà, mais tu auras besoin de quelque chose comme ça.

+0

cela me semble un peu dangereux. peut-être que cela fonctionne (je ne dis pas que ce ne sera pas le cas), mais je pense qu'un filtre de ligne est préférable de cacher les lignes pour éviter les cas de bord bizarre tels que les touches du curseur ne fonctionnent pas comme prévu –

3

Pour suivre la réponse de wangburger.
Pour lier la propriété IsEnabled pour chaque DataGridRow Activé en enregistrement que vous pouvez faire

<DataGrid ItemsSource="{Binding Path=RecordSet}" 
      AutoGenerateColumns="False" 
      IsReadOnly="True" 
      Name="ResultGrid"> 
    <DataGrid.Resources> 
     <Style TargetType="DataGridRow"> 
      <Setter Property="IsEnabled" Value="{Binding Enabled}"/> 
     </Style> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ID" Binding="{Binding Path=Id}" Width="Auto"/> 
     <DataGridTextColumn Header="Foo" Binding="{Binding Path=Foo}" Width="*"/> 
    </DataGrid.Columns> 
</DataGrid> 
0

Remarque: si vous définissez un style de ligne à IsEnabled=false alors cette ligne ne peut pas réellement être sélectionné du tout, ni ce que les touches du curseur saute dessus. Cela peut ou peut ne pas être ce que vous voulez.

si vous voulez spécifiquement mettre IsEnabled=false (et je vous vous rendez compte que donné à titre d'exemple), mais permet toujours la ligne à sélectionner alors vous aurez besoin (AFAIK) pour définir IsEnabled=false pour chaque modèle de colonne.

Questions connexes