从其他类更新时更新ListView

时间:2015-08-26 11:59:38

标签: c# wpf listview mvvm

我正在构建简单的应用程序,它在一个列表视图中显示特定格式的所有文件。我把课程分为了#34; DataFiles"我在哪里建立FileSystemWatcher,如果有什么变化。如果有什么变化,那么我想更新放在MainWindows.xaml中的Listview。

所以我在MainWindow.xaml中有我的MainWindowViewModel.cs和DataFiles.cs以及ListView。如何将List从DataFiles更新到MainWindow.xaml?

我的DataFiles类,如果有所帮助:

public FileSystemWatcher filewatcher;
    public string ConfigurationFilesSourcePath;
    public ObservableCollection<Files> fileslist { get; protected set; } = new ObservableCollection<Files>();

    public void InitializeFiles()
    {
        // Create a new FileSystemWatcher
        filewatcher = new FileSystemWatcher();

        // Set filter
        filewatcher.Filter = "*.txt";

        // Set the path
        filewatcher.Path = ConfigurationFilesSourcePath;

        // Subscribe to the Created event
        filewatcher.Created += new FileSystemEventHandler(FileOnchanged);
        filewatcher.Changed += new FileSystemEventHandler(FileOnchanged);
        filewatcher.Deleted += new FileSystemEventHandler(FileOnchanged);
        filewatcher.Renamed += new RenamedEventHandler(FileOnRenamed);

        // Enable the FileSystemWatcher events
        filewatcher.EnableRaisingEvents = true;

        RefreshFilesList();
    }

    private void FileOnchanged(object sender, FileSystemEventArgs e)
    {
        RefreshFilesList();
    }

    private void FileOnRenamed(object sender, RenamedEventArgs e)
    {
        RefreshFilesList();
    }

    public void RefreshFilesList()
    {
        fileslist.Clear();

        //string[] getfiles = Directory.GetFiles(FolderLocation);
        DirectoryInfo dir = new DirectoryInfo(ConfigurationFilesSourcePath);

        string[] extensions = new[] { ".txt" };

        int nof = 0;
        foreach (FileInfo file in dir.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray())
        {
            nof++;

            fileslist.Add(new Files()
            {
                FileId = nof,
                FileName = file.Name,
                FileChanged = file.LastWriteTime.ToString(),
                FileCreated = file.CreationTime.ToString(),
                OnlyNameWithoutExtension = Path.GetFileNameWithoutExtension(file.Name)
            });
        }

        NotifyPropertyChanged("fileslist");
    }

如果您认为我必须在WPF中相当新,那么你是对的:)很抱歉,如果这是一个愚蠢的问题。请求帮助。

XAML:

<ListView Name="lvfiles" Grid.Row="4" ItemsSource="{Binding fileslist}" SelectionMode="Single" SelectedItem="{Binding SelectedFiles}" DataContext="{Binding }" Style="{StaticResource ListView}">
                        <ListView.View>
                            <GridView x:Name="gridFiles">
                                <GridViewColumn>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <CheckBox Tag="{Binding ID}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn x:Name="FileId" Header="#" DisplayMemberBinding="{Binding FileId}" Width="Auto"/>

                                <GridViewColumn x:Name="FileName" Header="{inf:Loc ConfigurationsName}" Width="Auto">
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBox  Text="{Binding FileName, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" BorderThickness="0" Style="{StaticResource ListViewTextBoxes}"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>

                                <!--<GridViewColumn x:Name="FileName" Header="{inf:Loc ConfigurationsName}" DisplayMemberBinding="{Binding FileName}" Width="Auto"/>-->
                                <GridViewColumn x:Name="FileCreated" Header="{inf:Loc ConfigurationsCreated}" DisplayMemberBinding="{Binding FileCreated}" Width="Auto"/>
                                <GridViewColumn x:Name="FileChanged" Header="{inf:Loc ConfigurationsChanged}" DisplayMemberBinding="{Binding FileChanged}" Width="Auto"/>
                            </GridView>
                        </ListView.View>
                    </ListView>

1 个答案:

答案 0 :(得分:1)

在mainmenu中,您应该为PropertyChanged事件分配一个处理程序,在其中可以更新列表。

DataDiles.PropertyChanged+= DataFiles_PropertyChanged;

public void DataFiles_PropertyChanged(/*...*/)
{
    //Refresh the list
}

要获得更准确的代码,请编辑您的问题并完全添加DataFiles类的定义 我希望它会有所帮助。