我会使用一个绑定到
ObservableCollection<DupInfo>
的数据表格。
<Window x:Class="DataGridDupInfoStack.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid ItemsSource="{Binding items}">
</DataGrid>
</Grid>
</Window>
Codebehind:
public partial class MainWindow : Window
{
public ObservableCollection<DupInfo> items { get; set; }
public MainWindow()
{
InitializeComponent();
items = new ObservableCollection<DupInfo>();
items.Add(new DupInfo() { BaseDirectory = "Directory1", CheckSum = 0xFF, FullName = "Info1", Size = 100 });
items.Add(new DupInfo() { BaseDirectory = "Directory2", CheckSum = 0xFE, FullName = "Info2", Size = 150 });
items.Add(new DupInfo() { BaseDirectory = "Directory2", CheckSum = 0xFD, FullName = "Info3", Size = 200 });
this.DataContext = this;
}
}
这是您的DupInfo类。我省略了构造函数以加快处理速度。
public class DupInfo
{
public string FullName { get; set; }
public long Size { get; set; }
public uint? CheckSum { get; set; }
public string BaseDirectory { get; set; }
}
结果:
![enter image description here](https://istack.dev59.com/kWWRV.webp)
更新1:
我们没有可用的AddRange,但为此定义了一个扩展方法:
public static class ExtensionMethods
{
public static void AddRange(this ObservableCollection<DupInfo> value, List<DupInfo> list)
{
foreach (var dup in list)
value.Add(dup);
}
}
这是我们的新版本:
public partial class MainWindow : Window
{
public ObservableCollection<DupInfo> items { get; set; }
List<DupInfo> initialList { get; set; }
public MainWindow()
{
InitializeComponent();
items = new ObservableCollection<DupInfo>();
initialList = new List<DupInfo>();
initialList.Add(new DupInfo() { BaseDirectory = "Directory1", CheckSum = 0xFF, FullName = "Info1", Size = 100 });
initialList.Add(new DupInfo() { BaseDirectory = "Directory2", CheckSum = 0xFE, FullName = "Info2", Size = 150 });
initialList.Add(new DupInfo() { BaseDirectory = "Directory2", CheckSum = 0xFD, FullName = "Info3", Size = 200 });
items.AddRange(initialList);
this.DataContext = this;
}
}
public static class ExtensionMethods
{
public static void AddRange(this ObservableCollection<DupInfo> value, List<DupInfo> list)
{
foreach (var dup in list)
value.Add(dup);
}
}
所以我们正在从列表中加载元素...根据您的需求,我们可以在那里使用数组或其他任何内容。
但是请注意,如果更改我们引用指向的对象,则必须使用DependencyProperty或实现INotifyPropertyChanged。
您的属性将如下所示:
public ObservableCollection<DupInfo> items
{
get { return ( ObservableCollection<DupInfo>)GetValue(itemsProperty); }
set { SetValue(itemsProperty, value); }
}
public static readonly DependencyProperty itemsProperty =
DependencyProperty.Register("items", typeof( ObservableCollection<DupInfo>), typeof(MainWindow), new PropertyMetadata(null));
更新2:
XAML:
<Window x:Class="DataGridDupInfoStack.MainWindow"
xmlns="http:
xmlns:x="http:
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<DataGrid ItemsSource="" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Full Name" Binding="" />
<DataGridTextColumn Header="Size" Binding="" />
<DataGridTextColumn Header="CheckSum" Binding="" />
<DataGridTextColumn Header="BaseDirectory" Binding="" />
<DataGridTemplateColumn Header="Mark for deletion">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<Button Content="Delete" Click="btnDelete_Click"/>
</StackPanel>
</Grid>
</Window>
后台代码:
public partial class MainWindow : Window
{
public ObservableCollection<DupInfo> items
{
get { return (ObservableCollection<DupInfo>)GetValue(itemsProperty); }
set { SetValue(itemsProperty, value); }
}
public static readonly DependencyProperty itemsProperty =
DependencyProperty.Register("items", typeof(ObservableCollection<DupInfo>), typeof(MainWindow), new PropertyMetadata(null));
List<DupInfo> initialList { get; set; }
public MainWindow()
{
InitializeComponent();
items = new ObservableCollection<DupInfo>();
initialList = new List<DupInfo>();
initialList.Add(new DupInfo() { BaseDirectory = "Directory1", CheckSum = 0xFF, FullName = "Info1", Size = 100 });
initialList.Add(new DupInfo() { BaseDirectory = "Directory2", CheckSum = 0xFE, FullName = "Info2", Size = 150 });
initialList.Add(new DupInfo() { BaseDirectory = "Directory2", CheckSum = 0xFD, FullName = "Info3", Size = 200 });
items.AddRange(initialList);
this.DataContext = this;
}
private void btnDelete_Click(object sender, RoutedEventArgs e)
{
foreach (var dup in items.ToList())
{
if (dup.ToDelete)
{
items.Remove(dup);
}
}
}
}
public static class ExtensionMethods
{
public static void AddRange(this ObservableCollection<DupInfo> value, List<DupInfo> list)
{
foreach (var dup in list)
value.Add(dup);
}
}
并且你更新后的DupInfo类:
public class DupInfo : INotifyPropertyChanged
{
private bool _ToDelete;
public bool ToDelete
{
get { return _ToDelete; }
set
{
_ToDelete = value;
PropertyChanged(this, new PropertyChangedEventArgs("ToDelete"));
}
}
public string FullName { get; set; }
public long Size { get; set; }
public uint? CheckSum { get; set; }
public string BaseDirectory { get; set; }
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
就是这样。祝你好运!