Nano Hash - криптовалюты, майнинг, программирование

Фильтрация Datagrid, привязанного к DataTable WPF

Я пытаюсь создать систему фильтрации для DataGrid в WPF так же, как в ссылке -

http://www.codeproject.com/Articles/42227/Automatic-WPF-Toolkit-DataGrid-Filtering

введите здесь описание изображения

Я использую ту же библиотеку, что и они, но дело в том, что мне нужно привязать свой DataGrid к таблице данных...

И вот где ошибка. Библиотека фильтров работает отлично, пока ItemSource является СПИСКОМ, но перестает работать, когда ItemSource является DataTable...

Любые альтернативы или предложения??? Рабочие примеры приветствуются.

Я использую AutoColumnGeneration=True, так как не знаю, сколько столбцов мне нужно заполнить


  • Вы пытались привязать ItemSource к CollectionViewSource, взятому из DataTable? 23.06.2013
  • На самом деле дело в том, что мой AutoColumnGeneration = TRUE.. поскольку я не знаю точного количества столбцов, которые мне нужно заполнить.. Теперь любые предложения 24.06.2013
  • Я должен был сделать это раньше. Но усилия были очень короткими, поэтому я создал CollectionViewSource из строк и использовал сделанный на заказ преобразователь значений. Это сработало отлично, но я уверен, что есть лучшие способы. Кроме того, в первую очередь вы не можете использовать код, обернутый вокруг строго типизированных коллекций с таблицей данных, потому что таблица данных использует упакованные массивы! 24.06.2013
  • Могу ли я получить рабочий образец того же самого?? 24.06.2013
  • Если больше никто не придет с чем-то, я могу проверить свои вещи и найти это, но готовы ли вы принять что-то, что является быстрым решением? 24.06.2013
  • да, чувак, это как бы срочно... до сих пор мне не помогло ни одно решение.. 25.06.2013

Ответы:


1

Каждый DataRow в таблице содержит плоский массив объектов, тип которых доступен только путем извлечения его из массива DataColumns. Поскольку все в массиве упаковано, библиотека, основанная на строго типизированной коллекции, такой как List of T, не будет совместима. Это должно объяснить, почему он не работает.

Вы написали, что это срочно, и мне пришлось однажды сделать то же самое в проекте с очень коротким запалом, и я изложу свой подход. Этот ответ предназначен только для СРОЧНЫХ случаев.

Вот ViewModel...

public class ViewModel : INotifyPropertyChanged
{
    public CollectionView MyCollectionView { get; set; }
    public ViewModel(DataTable dataTable)
    {
        MyCollectionView = CollectionViewSource.GetDefaultView(dataTable.Rows) as CollectionView;
        if (MyCollectionView != null)
        {
            MyCollectionView.Filter = o => (o as DataRow).ItemArray[0].ToString().Contains("2");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}

Конструктор берет DataTable и использует Rows в качестве источника привязки к CollectionView. Поскольку CollectionView имеет встроенные свойства фильтрации и сортировки, это отличный инструмент для использования в качестве источника привязки. Также, как показано, конструктор добавляет фильтр для примера, который поможет вам начать работу.

Чтобы представить данные пользователю, рассмотрите следующий Xaml...

        <DataGrid ItemsSource="{Binding MyCollectionView}"
                  AutoGenerateColumns="False"
                  CanUserSortColumns="True"
                  IsReadOnly="True"
                  >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name"    Binding="{Binding ., Converter=
                       {db:DbConverter}, ConverterParameter=PersonName}"/>
                <DataGridTextColumn Header="Address"    Binding="{Binding ., Converter=
                        {db:DbConverter}, ConverterParameter=PersonAddress}"/>
            </DataGrid.Columns>
        </DataGrid>

Это DataGrid, ItemsSource которого привязан к CollectionView, который был объявлен и назначен в ViewModel. Каждый столбец данных проходит через преобразователь вместе с параметром, который сообщает преобразователю, что ему нужно делать.

В довершение всего, вот конвертер...

public class DbConverter : MarkupExtension, IValueConverter
{
    private static readonly Dictionary<object, int> ParameterToColumnMapping;
    static DbConverter()
    {
        ParameterToColumnMapping = new Dictionary<object, int>
            {
                {"PersonName", 0}, {"PersonAddress", 1}
            };
    }
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {
        DataRow dr = value as DataRow;
        if (dr != null)
        {
            if (ParameterToColumnMapping.ContainsKey(parameter))
            {
                return dr.ItemArray[ParameterToColumnMapping[parameter]];
            }
        }
        return value;
    }
    public object ConvertBack(object value, Type targetType, object parameter, 
               System.Globalization.CultureInfo culture)
    {
        return null;
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

Это должно помочь вам вернуться к фильтрации и представлению, когда у вас есть DataTable и срочная ситуация. На все кодирование уходит около часа. Также обратите внимание, что мой привязывается к Rows, но вы также можете привязаться к DefaultView, если это необходимо.

25.06.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..