我在使用MVVM的Windows 10 Universal App上开发了一个应用程序,但是我遇到了一个很大的问题。
我会添加一个ObservableCollection项目(在第二个窗口中创build)到MVVM,然后在MainPage的ListView上显示新项目,但不刷新!
2个窗户总是打开的
http://img.zgserver.com/c%23/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();
如果我正确理解你的代码和需求,我认为问题的一部分是,当你点击创建按钮时,你“新”了你的MVVMList和你的MainPage。
因此,在不了解使用MVVM Light和IOC容器的建议的情况下,通过将MVVMList类设置为单例并让MainPage将其用于数据上下文,您可以快速完成要做的工作。 当您的其他窗口添加到MVVMList.onglets集合时,它将立即反映在当前打开的MainPage中。 让我知道如果你需要一些代码片段。 祝你好运!
[编辑如下]
午餐还有几分钟,所以这里是一个简单的例子。 再一次,没有进入MVVM是什么,不是。 就我个人而言,我会以不同的方式做这件事,但那不在你的问题的范围之内。 完全公开 – 这是在WPF中,但同样的逻辑适用,我只是没有在我使用的PC上的Windows 10。 我也简化了集合类型的字符串。 这不是要复制/粘贴到您的代码,因为它不会在你的例子中工作 – 但应该很容易转移。
MVVMList类:
public class MVVMList: INotifyPropertyChanged { //Singleton section private static MVVMList instance; private MVVMList() { } public static MVVMList Instance { get { if (instance == null) { instance = new MVVMList(); } return instance; } } //end singleton section private ObservableCollection<string> _onglets = new ObservableCollection<string>(); public ObservableCollection<string> Onglets { get { return _onglets; } set { if (_onglets != value) { _onglets = value; if (PropertyChanged != null) PropertyChanged.Invoke(this, new PropertyChangedEventArgs("onglets_list")); } } } //INotify implementation public event PropertyChangedEventHandler PropertyChanged; }
主页:
<ListView x:Name="onglets" x:FieldModifier="public" ItemsSource="{Binding Onglets}" />
MainPage.cs:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.DataContext = MVVMList.Instance; Loaded += MainWindow_Loaded; } void MainWindow_Loaded(object sender, RoutedEventArgs e) { var x = new CreateWindow(); x.Show(); } }
CreateWindow.cs:
private void CreateButton_Click(object sender, RoutedEventArgs e) { if (!string.IsNullOrEmpty(StringTextBox.Text)) { MVVMList.Instance.Onglets.Add(StringTextBox.Text); } }