Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中重新加载ViewModel而不重新启动应用程序?_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何在WPF中重新加载ViewModel而不重新启动应用程序?

C# 如何在WPF中重新加载ViewModel而不重新启动应用程序?,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在使用WPF MVVM试图找出重新加载ViewModel的最佳方式(我想整个视图也可以) 我的模型背后的数据是从目录中存储的一系列平面文件中解析出来的。目录的位置保存在.Settings文件中,用户可以通过弹出窗口查看 如果用户更改或更新他们想要使用的目录,我如何重新创建ViewModel,以便使用的数据是新目录中的数据 我想这就像在应用程序运行时切换到另一个数据库一样,如果这就是我作为数据存储的情况。目前,我显示一条消息,要求用户重新启动应用程序 以下是重要的代码: public Sign

我正在使用WPF MVVM试图找出重新加载ViewModel的最佳方式(我想整个视图也可以)

我的模型背后的数据是从目录中存储的一系列平面文件中解析出来的。目录的位置保存在.Settings文件中,用户可以通过弹出窗口查看

如果用户更改或更新他们想要使用的目录,我如何重新创建ViewModel,以便使用的数据是新目录中的数据

我想这就像在应用程序运行时切换到另一个数据库一样,如果这就是我作为数据存储的情况。目前,我显示一条消息,要求用户重新启动应用程序

以下是重要的代码:

public SignalViewModel()
{
    _trafficSignals = new ObservableCollection<TrafficSignal>(DataAccess.TrafficSignalRepository.GetTrafficSignals());
}



public static List<TrafficSignal> GetTrafficSignals()
{
    string dataStore = Properties.Settings.Default.SaveLocation;
    var signals = new List<TrafficSignal>();
    if (Directory.Exists(dataStore))
    {
        var files = Directory.GetFiles(dataStore, "CP*.SAV");
        Array.Sort(files);
        foreach (var file in files)
        {
            signals.Add(LoadFile(file));
        }
    }
    return signals;
}
公共信号视图模型() { _trafficSignals=新的ObservableCollection(DataAccess.TrafficSignalRepository.GetTrafficSignals()); } 公共静态列表GetTrafficSignals() { 字符串数据存储=Properties.Settings.Default.SaveLocation; var信号=新列表(); if(目录.Exists(数据存储)) { var files=Directory.GetFiles(数据存储,“CP*.SAV”); Array.Sort(文件); foreach(文件中的var文件) { 添加(加载文件(文件)); } } 返回信号; }
您可以使用

Properties.Settings.Default.Reload();
然后再次调用
GetTrafficSignals()


尽管如此,我在过去使用重新加载方法时遇到了一些问题…

我将通过两个事件来解决这个问题:

  • 在设置中执行INotifyPropertyChanged
  • 然后,在
    TrafficSignalRepository
    中,我将实施一个事件(例如
    SaveLocationChanged
    ),该事件是在为
    SaveLocation
    -属性引发设置的PropertyChanged事件后引发的
  • 然后,您可以在ViewModel中注册
    SaveLocationChanged
    事件。在已注册的事件处理程序中,您只需再次调用
    GetTrafficSignals()
    ,将新值分配给字段并引发ViewModel的
    NotifyPropertyChanged
    事件。其余的应该通过数据绑定自动完成