[英]How to track a specific file changes using MVVM pattern in .net?
我正在使用 Visual Studio 2022 开发一个 .NET WPF 项目,我向我的应用程序添加了托盘图标功能。 我在 mainwindow.xaml.cs 中管理托盘图标部分,但我还需要在我的 mainviewmodel class 中跟踪文件更改。 我如何将此事件传递给 mvvm 或者将数据传递给 mainviewmodel? 任何帮助,将不胜感激。
public void CreateFileWatcher(string path)
{
watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = nameof(AppStateModel);
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
Thread.Sleep(1000);
var appState = CheckAppState();
AppState = appState;
string workingDirectory = Environment.CurrentDirectory;
string projectDirectory = Directory.GetParent(workingDirectory).Parent.FullName;
var path = Path.Combine(projectDirectory, "Assets");
switch (appState)
{
case 1:
m_notifyIcon.Icon = new System.Drawing.Icon(Path.Combine(path, "48x48_active.ico"));
break;
case 2:
m_notifyIcon.Icon = new System.Drawing.Icon(Path.Combine(path, "48x48_inactive.ico"));
break;
case 4:
m_notifyIcon.Icon = new System.Drawing.Icon(Path.Combine(path, "48x48_running.ico"));
break;
default:
break;
}
}
private int CheckAppState()
{
try
{
var tempFile = Path.Combine(AppWizard.Default.FolderPath, nameof(AppStateModel));
if (!File.Exists(tempFile))
return -1;
var _path = tempFile;
using (var stream = new FileStream
(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
var appStateModel = JsonConvert.DeserializeObject<AppStateModel>(File.ReadAllText(tempFile));
if (appStateModel != null)
{
if (appStateModel.CurrentState == AppStates.Ready)
return 1;
else if (appStateModel.CurrentState == AppStates.Dead || appStateModel.CurrentState == AppStates.Expired)
return 2;
else if (appStateModel.CurrentState == AppStates.Busy)
return 4;
}
}
}
catch (Exception ex)
{
FileLogger.Default.WriteExceptionLog(ex);
}
return -1;
}
观察者服务可能如下所示:
public class FileWatcherService
{
FileSystemWatcher watcher;
public FileWatcherService()
{
CreateFileWatcher();
}
public event EventHandler<FileSystemEventArgs> FileChanged;
public void CreateFileWatcher()
{
watcher = new FileSystemWatcher(@"C:\Temp");
watcher.NotifyFilter = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName
| NotifyFilters.FileName
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.Security
| NotifyFilters.Size;
watcher.Changed += MakeANote;
watcher.Created += MakeANote;
watcher.Deleted += MakeANote;
watcher.Renamed += MakeANote;
watcher.Filter = "*.*";
watcher.IncludeSubdirectories = true;
watcher.EnableRaisingEvents = true;
}
private void MakeANote(object sender, FileSystemEventArgs e)
{
FileChanged?.Invoke(this, e);
}
}
一种简单的方法是将“watcher”放在 View Model 中:
public class MainViewModel :Binding
{
FileWatcherService _fileWatcherService = new FileWatcherService();
public MainViewModel()
{
_fileWatcherService.FileChanged += OnFileChanged;
}
private void OnFileChanged(object sender, FileSystemEventArgs e)
{
LastAction = e.ChangeType.ToString();
File = e.Name;
}
string _lastAction;
public string LastAction
{
get { return _lastAction; }
set { _lastAction = value;NotifyPropertyChanged(nameof(LastAction)); }
}
string _file;
public string File
{
get { return _file; }
set { _file = value; NotifyPropertyChanged(nameof(File)); }
}
}
示例 XAML 代码如下:
<Grid>
<Grid.DataContext>
<local:MainViewModel/>
</Grid.DataContext>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding File}"/>
<TextBlock Text=" has "/>
<TextBlock Text="{Binding LastAction}"/>
</StackPanel>
</Grid>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.