2013-10-11 14 views
12

Ich muss Zeilen in Datagrid basierend auf Parametern und Werten im Datagrid ausblenden. Ich dachte mir, so etwas zu machen;WPF-Zeile in Datagrid basierend auf Bedingung ausblenden

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

Ich kann einfach nicht herausfinden, wie man die Zeile wirklich ausblenden. Bitte beachten Sie, dass ich die Zeile aus dem Datagrid oder der Elementquelle nicht entfernen möchte.

Antwort

17

Wenn hideRow kein Feld der Tabelle ist (das heißt nicht eine Spalte in der 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> 

Und Converter mit Ihrer Logik realisieren. Der Typ der gebundenen Variable, AnyProp oben, ist IhrPropertyType unten. AnyProp kann eine der Spalten in der Zeile sein.

[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; 
     } 
    } 


} 

‚Wert‘ wird AnyProp, und es kann in der Logik verwendet werden, ob oder ob nicht bestimmt die Reihe zu zeigen, oder diese Entscheidung kann auf etwas ganz anderes, wie zum Beispiel ‚hideRow‘ in der beruhen Beispiel.

+1

Ich kann nicht herausfinden, was 'If hideRow es ist kein Feld der Tabelle:' bedeutet. Sorry, aber Englisch ist nicht meine Muttersprache und das ergibt für mich aufgrund der falschen Grammatik keinen Sinn. – WoIIe

+0

'hideRow' im folgenden Code ist eine falsche Variable. Bei wirklich ist es eine benutzerdefinierte Logik, die Sie implementieren müssen. – progpow

+0

Danke, das hat mich auf den richtigen Weg gebracht. @Wolle Ich habe versucht, es zu korrigieren, hoffentlich so, wie es beabsichtigt war. Ich musste eine IValueConverter.ConvertBack-Methode hinzufügen, da sie sonst nicht kompiliert werden würde - ich weiß nicht, ob es da einen Weg gibt? Am Ende war es mir egal, aber ich fragte mich, ob es möglich war, das gesamte gebundene Zeilenobjekt und nicht nur ein Feld zu übergeben. – njplumridge

8

Sie können dies in Datagrid.ItemContainerStyle tun, anstatt es in Code-Behind zu tun ...

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

ein Collection Verwenden Sie das Datagrid mit Ihren Unternehmensdaten zu verknüpfen. Die CollectionViewSource löst für jede Zeile ein Filterereignis aus. In diesem Fall kann Ihr Code entscheiden, ob die Zeile angezeigt werden soll.

zu XAML hinzufügen:

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

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

die folgenden Code hinter Datei hinzufügen:

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

Erstellen Sie den Filter Eventhandler. Sie können die Zeilendaten von e.Item abrufen. Wenn Sie e.Accepted einstellen, können Sie steuern, ob die Zeile angezeigt werden soll.

Verwandte Themen