gpt4 book ai didi

c# - 将数据加载到 ListView (WPF)

转载 作者:行者123 更新时间:2023-11-30 17:43:24 25 4
gpt4 key购买 nike

我正在尝试制作重复文件检测器(相关问题:Compare adjacent list items)。我的一般结构是这样的:

  1. 扫描目录并将每个文件所需的详细信息加载到 DupInfo 对象中
  2. 计算任何与另一个文件大小匹配的 CRC
  3. 显示任何具有匹配大小和 CRC(以及可选的基本目录)的任何内容,并允许用户检查他们想要删除的内容(既可以手动删除,也可以使用“检查所有第一个重复项”之类的按钮)。
  4. 删除所选文件。

我在执行第 3 步时遇到问题。第 1 步和第 2 步中的数据位于 DupInfo 对象列表中。这是类定义。

public class DupInfo
{
public string FullName { get; set; }
public long Size { get; set; }
public uint? CheckSum { get; set; }
public string BaseDirectory { get; set; }
public DupInfo(FileInfo file, Crc32 crc, int level)
{
FullName = file.FullName;
Size = file.Length;
CheckSum = crc.ComputeChecksum(File.ReadAllBytes(FullName));
BaseDirectory = FullName.Substring(0,FullName.NthIndexOf("\\",level));
}
public DupInfo(FileInfo file, int level)
{
FullName = file.FullName;
Size = file.Length;
BaseDirectory = FullName.Substring(0, FullName.NthIndexOf("\\", level));
}

}

我的问题是:

  1. 从自定义类 (DupInfo) 列表将数据加载到 Listview 对象的最佳方法是什么?

  2. 如果 Listview 不是显示我的重复集的最佳工具,那么最好的是什么?

最佳答案

我会使用绑定(bind)到 ObservableCollection<DupInfo> 的 DataGrid .

<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>

代码隐藏:

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

更新 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。

您的属性(property)将如下所示:

    public  ObservableCollection<DupInfo> items
{
get { return ( ObservableCollection<DupInfo>)GetValue(itemsProperty); }
set { SetValue(itemsProperty, value); }
}

// Using a DependencyProperty as the backing store for items. This enables animation, styling, binding, etc...
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://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<DataGrid ItemsSource="{Binding items}" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Full Name" Binding="{Binding FullName}" />
<DataGridTextColumn Header="Size" Binding="{Binding Size}" />
<DataGridTextColumn Header="CheckSum" Binding="{Binding CheckSum}" />
<DataGridTextColumn Header="BaseDirectory" Binding="{Binding BaseDirectory}" />
<DataGridTemplateColumn Header="Mark for deletion">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=ToDelete, UpdateSourceTrigger=PropertyChanged}" />
</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); }
}

// Using a DependencyProperty as the backing store for items. This enables animation, styling, binding, etc...
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 { };
}

就是这样。祝你好运!

关于c# - 将数据加载到 ListView (WPF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31033414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com