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>