2013-10-11 36 views
12

我需要根據數據網格中的參數和值來隱藏datagrid中的行。我想要做這樣的事情;WPF根據條件在數據網格中隱藏行

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

我只是不能確定如何實際隱藏行。請注意我不想刪除數據網格或項目源的行。

回答

17

如果hideRow不表的一個字段(即,不是在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> 

並實現與你的邏輯轉換。上面的AnyProp綁定變量的類型將爲yourPropertyType。 AnyProp可以是該行中的任何列。

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


} 

「價值」將是AnyProp,並且它可以在其確定是否要顯示的行,或該決定可以基於別的東西完全邏輯被使用,如在「hideRow」例。

+1

我找不出什麼'如果hideRow它不是一個表的字段:'的意思。對不起,但英語不是我的母語,由於語法錯誤,這對我沒有任何意義。 – WoIIe

+0

下面代碼中的'hideRow'是一個假變量。實際上,這是您需要實施的定製邏輯。 – progpow

+0

謝謝,這讓我走上了正軌。 @Wolle我試圖糾正它,希望按照它的意圖。我不得不添加一個IValueConverter.ConvertBack方法,因爲它不會編譯 - 否則我不知道是否有解決方法?最後對我來說並不重要,但是我確實想知道是否有可能傳遞整個綁定的行對象,而不僅僅是一個字段。 – njplumridge

8

可以在Datagrid.ItemContainerStyle做到這一點,而不是在隱藏代碼做的......

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

使用CollectionViewSource到DataGrid與您的業務數據鏈路。 CollectionViewSource爲每一行啓動一個過濾器事件。在這種情況下,您的代碼可以決定是否顯示該行。

添加到您的XAML:

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

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

到您的代碼添加下面的隱藏文件:

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

創建過濾器事件處理程序。您可以從e.Item獲取行數據。通過設置e.Accepted,您可以控制是否顯示該行。