2017-02-03 2 views
0

Я хочу отключить видимость (сбой) определенных строк при установке флажка, а связанные данные в этой строке соответствуют определенным критериям. например (псевдо-код):Wpf DataGrid скрыть строки, когда флажок равен true, и привязанные данные истинны

If(IsHideEnabledChecked && Row.Data.Enabled) 
     Row.Visibility = Collapsed 

Я создал DataGrid (ы) про грамматический в связи с характером проекта я работаю, количество DataGrids должно соответствовать количеству объектов в моем коллекция. Обычно в не мир МОФ вы Переберите сетки и изменить строку с условием:

public void HideEnabled(object sender, RoutedEventArgs) 
    Foreach(DataGrid grid in DataGrids) 
    { 
    Foreach(DataGridRow row in grid) 
    { 
     if(row[0].Value == True) 
      row.Visibile = false 
    } 
    } 

Мой вопрос, как я скрыть строки после флажком выбран? и как это будет проверяться на значения в текущей строке? Можно ли все это сделать в C#? Я осмотрел и вижу, что dataTriggers можно использовать для привязки элемента управления к столбцу и типу данных, но это не будет включать проверку данных привязки (свойство «включено»)

Любая помощь будет очень признательна :)

+0

Я бы для добавления триггера данных в строках, связав триггер данных с флажком, когда флажок Правда, вы использовать setter-Property, чтобы скрыть/свернуть – JohnChris

+0

Как добавить триггеры данных в строках в коде? Я создаю несколько datagrids в коллекции, а не XAML. Также, если флажок установлен, мне нужно скрыть только те строки, которые имеют свойство привязки (enabled == true), это можно сделать в свойстве setter? – user2311703

+0

WPF почти требует подхода MVVM, который является кодом для моделей данных и моделей просмотра, и почти никакого кода для элементов представления он должен быть чистым Xaml, где это возможно, поэтому ваша модель View говорит, что у вас есть 10 элементов данных, которые вы просматриваете, скажем, Привяжите ко всем элементам данных затем отформатируйте их, как описано в этом шаблоне, и используйте эти привязки для отображения данных. – MikeT

ответ

0

вы должны связать элемент управления, который вы хотите скрыть в checkbox.IsChecked это будет дать вам логическое значение для видимости связывания, что вы можете конвертировать с BooleanToVisibilityConverter я предложил бы использовать DataTemplate и коллекцию Binding, а не код, но вы можете сделать это в коде, а также

<UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
</UserControl.Resources> 
<Checkbox x:Name="hider" /> 
<Control Visibility="{Binding IsChecked, Converter={StaticResource BooleanToVisibilityConverter}, ElementName=hider}" /> 

or you ca п создать свой собственный конвертер, который будет обрабатывать несколько значений, если вы хотите совместить флажок с другим значением см MultiValueConverter

public class MultiBooleanToVisibilityConverter : IMultiValueConverter 
{ 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values.OfType<bool>().All(b => b == true))// your logic here 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new InvalidOperationException("One Way only"); 
    } 
} 

, а затем использовать

<Control.Visibility> 
    <MultiBinding Converter="{StaticResource MultiBooleanToVisibilityConverter}"> 
     <Binding Path="IsChecked" ElementName="hider"/> 
     <Binding Path="secondfield" /> 
    </MultiBinding> 
</Control.Visibility> 
+0

Не один элемент управления. Это определенный набор строк в datagrid и будет выполняться в коде внутри этих конкретных данных, если это какая-либо помощь. – user2311703

+0

Спасибо, у меня будет трещина при этом методе :) – user2311703

+0

@ user2311703 Я немного неправильно понял вопрос, поэтому переключился на многозначный конвертер, однако каждый элемент управления - это один элемент управления, нет ограничений на то, сколько элементов управления можно связать аналогичным образом. – MikeT

0

Вы можете обрабатывать Checked событие для CheckBox и найти его родительского DataGridRow контейнера в визуальном дереве, используя следующий справочный метод:

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     CheckBox checkBox = sender as CheckBox; 
     var dataObject = checkBox.DataContext as YourDataClass; 
     if (dataObject.SomeProperty == true) 
     { 
      DataGridRow parentRow = FindParent<DataGridRow>(checkBox); 
      if (parentRow != null) 
       parentRow.Visibility = Visibility.Collapsed; 
     } 
    } 

    private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject 
    { 
     var parent = VisualTreeHelper.GetParent(dependencyObject); 

     if (parent == null) return null; 

     var parentT = parent as T; 
     return parentT ?? FindParent<T>(parent); 
    } 

Вы просто подключите обработчик событий для события Checked, как обычно. Либо в XAML разметке:

<CheckBox ... Checked="CheckBox_Checked" /> 

Или программно:

CheckBox chk = new CheckBox(); 
chk.Checked += CheckBox_Checked; 
+0

Спасибо за вход! Как это связано с данными, которые у меня есть в памяти? Я не могу найти ссылку на что-нибудь подобное. в моей попытке мне пришлось немного изменить код, чтобы объект данных можно было проверить условно: checkBox.DataContext = _viewModel.EndPointTables; \t \t \t var dataObject = checkBox.DataContext как словарь >; – user2311703

+0

Вам не нужна ссылка на DataGrid. Вам нужна только ссылка на родительский DataGridRow флажка, если вы хотите скрыть строку, в которой находится флажок. – mm8

+0

Извините, что предыдущий комментарий не мог быть отредактирован: Спасибо за вход! Как это связано с данными, которые у меня есть в памяти? Я не могу найти ссылку на что-нибудь подобное. в моей попытке мне пришлось немного изменить код, чтобы объект данных мог быть проверен условно, модель представления на самом деле является словарем , где список - это то, что связано с каждой сеткой данных (я генерирую несколько в пользовательском интерфейсе)) Я вообще не вижу ссылку на какую-либо сетку? извините, если я был глупым здесь, новый для мышления WPF – user2311703

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