Member 12674862 Ответов: 1

Исключите повторяющиеся значения из datagrid WPF


Пожалуйста, объясните мне, как удалить повторяющиеся значения из одного указанного столбца в представлении wpf datagrid

я искал в интернете, но нашел решения для кодирования Winform iam не получил никаких кодов wpf и не знаю, как преобразовать winform syntex в коды WPF..

Что я уже пробовал:

вот этот код winform:
string initialnamevalue = grdUniqueNames.Rows[0].Cells[cellno].Text;

     //Step 2:

     for (int i = 1; i < grdUniqueNames.Rows.Count; i++)
     {

         if (grdUniqueNames.Rows[i].Cells[cellno].Text == initialnamevalue)
             grdUniqueNames.Rows[i].Cells[cellno].Text = string.Empty;
         else
             initialnamevalue = grdUniqueNames.Rows[i].Cells[cellno].Text;
     }

1 Ответов

Рейтинг:
4

Graeme_Grant

Самый простой способ-это модель "сначала данные" с использованием шаблона MVVM. Изменения, внесенные в данные, отражаются в пользовательском интерфейсе с помощью привязки данных. Таким образом, вы можете привязать свои данные к любому элементу управления, и изменения будут автоматически отражены. Ниже приведен пример, который демонстрирует это:

Во-первых, нам нужно создать пару вспомогательных классов.

1. Привязка системы:

public abstract class ObservableBase : INotifyPropertyChanged
{
    public void Set<TValue>(ref TValue field, TValue newValue, [CallerMemberName] string propertyName = "")
    {
        if (EqualityComparer<TValue>.Default.Equals(field, default(TValue)) || !field.Equals(newValue))
        {
            field = newValue;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

2. обработка события нажатия кнопки (команда):
public class RelayCommand<T> : ICommand
{
    #region Fields

    private readonly Action<T> _execute;
    private readonly Predicate<T> _canExecute;

    #endregion

    #region Constructors

    public RelayCommand(Action<T> execute) : this(execute, null)
    {
    }

    public RelayCommand(Action<T> execute, Predicate<T> canExecute)
    {
        _execute = execute ?? throw new ArgumentNullException("execute");
        _canExecute = canExecute;
    }

    #endregion

    #region ICommand Members

    public bool CanExecute(object parameter)
        => _canExecute == null ? true : _canExecute((T)parameter);

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
        => _execute(parameter == null ? default(T) : (T)parameter);

    #endregion
}

Далее класс для хранения выборочных данных:
public class PersonModel : ObservableBase
{
    private string name;
    public string Name
    {
        get { return name; }
        set { Set(ref name, value); }
    }

    private string age;
    public string Age
    {
        get { return age; }
        set { Set(ref age, value); }
    }
}

Далее следует ViewModel для хранения данных (моделей) и обработки события button click (command) :
class MainViewModel
{
    public MainViewModel()
    {
        for (int i = 0; i < 100; i++)
        {
            People.Add(new PersonModel
            {
                Name = $"Person {i}",
                Age = rand.Next(20, 25).ToString()
            });
        }

        ClickCommand = new RelayCommand<bool>(Clicked);
    }

    private Random rand = new Random();

    public ICommand ClickCommand { get; }

    public ObservableCollection<PersonModel> People { get; }
    = new ObservableCollection<PersonModel>();

    private void Clicked(bool state)
    {
        //remove duplelicates
        foreach (var group in People.GroupBy(x => x.Age))
        {
            var items = group.Skip(1);
            if (items.Any())
                foreach (var item in items)
                    item.Age = string.Empty;
        }
    }
}

Вышеприведенная модель представления обрабатывает удаление дубликатов. И последнее-это пользовательский интерфейс...
<Window x:Class="DataGridColumnClear.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:DataGridColumnClear"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <DataGrid ItemsSource="{Binding People}" GridLinesVisibility="None"/>
        <Button Padding="10,5" Margin="10" Grid.Row="1" HorizontalAlignment="Center"

                Content="Remove Dupelicates" Command="{Binding ClickCommand}"/>
    </Grid>
</Window>


Maciej Los

5ed!

Graeme_Grant

Спасибо :)

Member 12674862

Большое спасибо!.. но это не возможно в WPF? ух

Graeme_Grant

Это очень похоже на рабочее решение WPF. ;)