(急)wpf listview绑定数据源对象 与数据源更新同步

本人想要利用openfiledialog选取多个文件,构成数据源对象,并将选取文件的属性(如文件名,大小等)绑定显示到listview上,选取之后再可以添加删除改变对象而... 本人想要利用openfiledialog选取多个文件,构成数据源对象,并将选取文件的属性(如文件名,大小等)绑定显示到listview上,选取之后再可以添加删除改变对象而且要listview绑定显示也要更新显示,这样怎样完成呢??? 展开
 我来答
Yeshirow
2009-11-08 · TA获得超过340个赞
知道小有建树答主
回答量:74
采纳率:0%
帮助的人:137万
展开全部

组一个 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 的范围了

以下是运行时的效果:

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式