2013-10-11 2 views
12

Мне нужно скрыть строки в datagrid на основе параметров и значений в datagrid. Я решил сделать что-то подобное;WPF скрыть строку в datagrid на основе условия

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

Я просто не могу понять, как на самом деле скрыть строку. Обратите внимание, что я не хочу удалять строку с именем datagrid или источником элемента.

ответ

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, приведенной выше, будет ниже вашего типаPropertyType. 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

Я не могу понять, что 'if 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; 

Создать фильтр EventHandler. Вы можете получить данные строки из e.Item. Установив e.Accepted, вы можете контролировать, должна ли строка отображаться.

Смежные вопросы