如何在不重新启动应用程序的情况下在WPF中重新加载ViewModel?

时间:2015-09-02 22:34:46

标签: c# wpf mvvm

我正在使用WPF MVVM试图找出重新加载我的ViewModel的最佳方法(整个View也能正常工作)。

我的模型背后的数据是从存储在目录中的一系列平面文件中解析出来的。目录的位置保存在.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;
}

2 个答案:

答案 0 :(得分:1)

我会用两个事件来解决这个问题:

  1. 在设置中实施INotifyPropertyChanged
  2. TrafficSignalRepository中,我会实现一个事件(例如SaveLocationChanged),您在为SaveLocation - Property
  3. 设置的PropertyChanged事件后引发该事件

    然后您可以在ViewModel内注册SaveLocationChanged事件。在已注册的事件处理程序中,您只需再次调用GetTrafficSignals(),将新值分配给该字段并引发ViewModel的NotifyPropertyChanged事件。其余的应该通过数据绑定自动完成。

答案 1 :(得分:0)

您可以使用

重新加载已保存的设置
Properties.Settings.Default.Reload();

然后再次致电GetTrafficSignals()

尽管如此,我在过去使用Reload方法时遇到了一些问题......