(急)wpf listview绑定数据源对象 与数据源更新同步
组一个 FileInfo 构成的集合, 而此集合实现了 INotifyCollectionChanged 介面 (interface).
最简单的,例如:
public class MyFileInfo :System.Collections.ObjectModel.ObservableCollection<System.IO.FileInfo>
{
public void Add(string szFile)
{
if (System.IO.File.Exists(szFile)) base.Add(new System.IO.FileInfo(szFile));
}
public void Add(string[] szFiles)
{
foreach (string s in szFiles)
if (System.IO.File.Exists(s)) base.Add(new System.IO.FileInfo(s));
}
}
上面就是一个 MyFileInfo 的集合类,继承自 ObservableCollection, ObservableCollection 是一个实现了 INotifyCollectionChanged 的介面.
然后在你的 xaml 中:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication2.Window1"
x:Name="Window"
Title="Window1"
Width="720" Height="300"
WindowStartupLocation="CenterScreen"
xmlns:lx="clr-namespace:WpfApplication2"
>
<!-- 上 2 行中的 xmlns:lx 根据你自己的情形改变 -->
<Window.Resources>
<lx:MyFileInfo x:Key="mi"/> <!-- 集合资源,你也可以在代码中动态构造 -->
</Window.Resources>
<StackPanel x:Name="LayoutRoot">
<ListView IsSynchronizedWithCurrentItem="True" x:Name="myLV" ItemsSource="{StaticResource mi}" >
<ListView.View>
<GridView>
<GridViewColumn Header="Click to delete">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Click="OnDeleteItem" Content="Delete" Tag="{Binding}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}"/>
<GridViewColumn Header="Attributes" DisplayMemberBinding="{Binding Path=Attributes}"/>
<GridViewColumn Header="Creation" DisplayMemberBinding="{Binding Path=CreationTime}"/>
<GridViewColumn Header="Last Access" DisplayMemberBinding="{Binding Path=LastAccessTime}"/>
<GridViewColumn Header="Last Write" DisplayMemberBinding="{Binding Path=LastWriteTime}"/>
<GridViewColumn Header="Length" DisplayMemberBinding="{Binding Path=Length}"/>
<GridViewColumn Header="Read Only">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsReadOnly, Mode=OneWay}" IsEnabled="False"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<Button Content="Add some" HorizontalAlignment="Center" Click="Button_Click"/>
</StackPanel>
</Window>
相关的按钮事件 (Add some 和 Delete):
private void Button_Click(object sender, RoutedEventArgs e)
{
MyFileInfo mi = Window.Resources["mi"] as MyFileInfo;
Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
ofd.Multiselect = true;
ofd.ShowDialog();
mi.Add(ofd.FileNames);
}
private void OnDeleteItem(object sender, RoutedEventArgs e)
{
(Window.Resources["mi"] as MyFileInfo).Remove((sender as Button).DataContext as System.IO.FileInfo);
}
// Window.Resources["mi"] 是因为 mi 是 Window的资源
// 如果放在其他地方,自行变更
// 例如 放在 App.xaml 中就用 App.Current.Resources["mi"]
//另外, 如果需要对档案的实时监控(例如,添加一些档案到 MyFileInfo 集合后,有人对这些档案进行了 删除/修改 等操作,你可以使用 System.IO.FileSystemWatcher 来辅助 MyFileInfo 类,在接收到这些操作时(引发的事件中)对 MyFileInfo 集合中的项进行更新。 这个例子只是一种基本的实现,更祥细的方面就不必再写了,因为已不是 wpf 的范围了
以下是运行时的效果: