2013-10-11 15 views
12

Ho bisogno di nascondere le righe in datagrid in base a parametri e valori nel datagrid. Ho pensato di fare qualcosa del genere;WPF nascondi riga in datagrid in base alla condizione

foreach (System.Data.DataRowView dr in myDataGrid.ItemsSource) 
{ 
    //Logic to determine if Row should be hidden 
    if (hideRow == "Yes") 
    { 
     //Hide row code 
    } 
} 

Non riesco proprio a capire come nascondere la riga. Si prega di notare che non voglio rimuovere la riga dal datagrid o dall'origine dell'articolo.

risposta

17

Se hideRow non è un campo della tabella (vale a dire non è una colonna della DataGridRow):

<DataGrid.RowStyle> 
    <Style TargetType="{x:Type DataGridRow}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding AnyProp, Converter={StaticResource hiddenConverter}}" Value="True"> 
       <Setter Property="Visibility" Value="Collapsed"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 

e realizzare Converter con la logica. Il tipo della variabile associata, AnyProp sopra, sarà yourPropertyType qui sotto. AnyProp potrebbe essere una qualsiasi delle colonne nella riga.

[ValueConversion(typeof(yourPropType), typeof(bool))] 
public class hiddenConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (hideRow == "Yes") 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 


} 

'valore' sarà AnyProp, e può essere utilizzato nella logica che determina se visualizzare o meno la riga, o tale decisione può essere basata su qualcos'altro interamente, come 'hideRow' nel esempio.

+1

Non riesco a capire cosa 'Se hideRow non è un campo di tabella:' significa. Ci dispiace, ma l'inglese non è la mia lingua madre e questo non ha senso per me a causa della grammatica sbagliata. – WoIIe

+0

'hideRow' nel codice sottostante è una variabile falsa. In realtà è una logica personalizzata che è necessario implementare. – progpow

+0

Grazie, questo mi ha fatto sulla buona strada. @Wolle Ho provato a correggerlo, si spera nel modo in cui è stato inteso. Ho dovuto aggiungere un metodo IValueConverter.ConvertBack, poiché altrimenti non sarebbe stato compilato, non so se c'è un modo per aggirare questo? Alla fine non mi importava, ma mi chiedevo se fosse possibile passare l'intero oggetto della riga vincolata, piuttosto che un solo campo. – njplumridge

8

È possibile farlo in Datagrid.ItemContainerStyle invece di farlo in codebehind ...

<DataGrid> 
     <DataGrid.ItemContainerStyle> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
         <DataTrigger Binding="{Binding PROPERTY}" Value="VALUE"> 
           <Setter Property="Visibility" Value="Collapsed"/> 
2

Utilizzare un CollectionViewSource per collegare il DataGrid con i dati aziendali. CollectionViewSource genera un evento di filtro per ogni riga. In questo caso, il tuo codice può decidere se la riga deve essere visualizzata.

Aggiungi al tuo XAML:

<Window.Resources> 
    <CollectionViewSource x:Key="sampleViewSource" CollectionViewType="ListCollectionView"/> 
</Window.Resources> 

<DataGrid DataContext="{StaticResource sampleViewSource}" ItemsSource="{Binding}" 
      AutoGenerateColumns="False"> 

Aggiungere il seguente al codice al file:

stocksViewSource = ((System.Windows.Data.CollectionViewSource)(FindResource("sampleViewSource"))); 
sampleViewSource.Filter += sampleViewSource_Filter; 

Creare l'EventHandler filtro. È possibile ottenere i dati della riga da e.Item. Impostando e.Accettato puoi controllare se la riga deve essere visualizzata.