C# Windows 10 通用应用程序 - MVVM 刷新

标签 c# windows mvvm win-universal-app

我在使用 MVVM 的 Windows 10 Universal App 上开发了一个应用程序,但我遇到了一个大问题。
我会向 MVVM 添加一个 ObservableCollection 项目(在第二个窗口上创建),然后在 MainPage 的 ListView 上显示新项目,但它不会刷新!

2 个窗口始终打开

http://i.stack.imgur.com/WSo6v.jpg

MVVMList.cs代码

public class MVVMList : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private ObservableCollection<THEFile> onglets_cache = new ObservableCollection<THEFile>();
    public ObservableCollection<THEFile> onglets_list
    {
        get
        {
            return onglets_cache;
        }

        set
        {
            onglets_cache = value;
            if (PropertyChanged != null)
                PropertyChanged.Invoke(this,
                    new PropertyChangedEventArgs("onglets_list"));
        }
    }

    public MVVMList()
    {
        onglets_list = new ObservableCollection<THEFile>();
        Fonctions fonctions = new Fonctions();
        fonctions.LoadOnglets(onglets_cache);

    }

}

第二页代码(常开)——CreateFile.xaml.cs

    private void create_butt_Click(object sender, RoutedEventArgs e)
    {
        Fonctions fonc = new Fonctions(); MVVMList main = new MVVMList();
        fonc.SetupNew(main.onglets_list, "test" + ".php", "");
    }

    //SetupNew on Fonctions.cs
    public async void SetupNew(ObservableCollection<THEFile> list, string name, string content)
    {
        FolderPicker folderpick = new FolderPicker();
        folderpick.ViewMode = PickerViewMode.List;
        folderpick.FileTypeFilter.Add(".html"); folderpick.FileTypeFilter.Add(".htm"); folderpick.FileTypeFilter.Add(".HTML");
        folderpick.FileTypeFilter.Add(".php"); folderpick.FileTypeFilter.Add(".PHP");
        folderpick.FileTypeFilter.Add(".css"); folderpick.FileTypeFilter.Add(".CSS");
        folderpick.FileTypeFilter.Add(".js"); folderpick.FileTypeFilter.Add(".JS");

        StorageFolder storage_file = await folderpick.PickSingleFolderAsync();
        if (storage_file != null)
        {
            MainPage vm = new MainPage();
            list.Add(new THEFile { NameOfFile = name, PathOfFile = storage_file.Path + "\\" + name, CodeOfFile = content, already_opened = false, line = 0 });
            string path = storage_file.Path + @"\" + name;
            StorageFile file_create = await storage_file.CreateFileAsync(name, CreationCollisionOption.GenerateUniqueName);
            Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(file_create);
            SaveOnglets(list);
        }
    }

在 MainPage.xaml 上(始终打开)

...
<ListView x:Name="onglets" x:FieldModifier="public" ItemTemplate="{StaticResource Templa}" ItemsSource="{Binding onglets_list}" SelectionChanged="onglets_SelectionChanged" Margin="0,117,0,57" Visibility="Visible" ContainerContentChanging="onglets_ContainerContentChanging">
...

谢谢!

最佳答案

在您的 XAML 中,尝试使用 Collection View Source。

将此添加到您的 xaml 顶部:

<Page.Resources>
    <CollectionViewSource x:Name="MakesCollectionViewSource" IsSourceGrouped="True"/>
</Page.Resources>

设置你的 ListView :

ItemsSource="{Binding Source={StaticResource MakesCollectionViewSource}}"

然后在您的代码中,当您有一个项目列表时使用

MakesCollectionViewSource.Source = /* Some List<GroupInfoList<object>> that is generated from onglets_list*/

我这样创建我的列表,但它可能不相关,因为这是为了让我所有的对象名称按字母顺序排列:

    internal List<GroupInfoList<object>> GetGroupsByLetter()
    {
        var groups = new List<GroupInfoList<object>>();

        var query = from item in MakeList
                    orderby ((Make)item).MakeName
                    group item by ((Make)item).MakeName[0] into g
                    select new { GroupName = g.Key, Items = g };
        foreach (var g in query)
        {
            var info = new GroupInfoList<object>();
            info.Key = g.GroupName;
            foreach (var item in g.Items)
            {
                info.Add(item);
            }

            groups.Add(info);
        }

        return groups;
    }

public class GroupInfoList<T> : List<object>
{
    public object Key { get; set; }

    public new IEnumerator<object> GetEnumerator()
    {
        return (System.Collections.Generic.IEnumerator<object>)base.GetEnumerator();
    }
}

其中 MakeList 是我的可观察集合,Make 是集合中的对象,MakeName 是我尝试按字母顺序排列的字符串

然后调用

MakesCollectionViewSource.Source = GetGroupsByLetter();

关于C# Windows 10 通用应用程序 - MVVM 刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32993147/

相关文章:

c# - 如何更改 DateTimeFormatInfo.CurrentInfo AbbreviatedDayNames 集合

c# - 在可序列化的 C# 类上使用不带 XmlArray 的 XmlArrayItem 属性

c# - 如何在 Angular 6 中上传文件时修复 415 不受支持的媒体类型

windows - 为什么我从网上下载的帮助文件只有空白页?

WPF/MVVM - 我们应该为每个 ViewModel 创建一个不同的类吗?

c# - 为什么我不能在公共(public)抽象类的方法中使用 Linq Where 子句?

sql-server - Postgresql的独立实例是否可能

python - UnicodeEncodeError,需要修复

xaml - 绑定(bind)到 Xaml

c# - WPF项目中MVVM和MVC之间的主要区别是什么?