C#MVVM使用notifyicon从代码中调用ViewModel方法



我似乎无法在使用NotifyIcon后面的XAML代码中成功地从我的ViewModel中获取一种方法。该方法正确执行,如使用断点进行调试模式测试的,但视图中没有任何发生。

所讨论的方法是RefreshData,可以从视图中的一个按钮(按预期工作)或右键单击Notifyicon并选择"刷新数据"(无需执行)。我将在下面发布相关代码。任何帮助将不胜感激!

codebehind中的mainwindow构造函数

public MainWindow()
    {
        try
        {
            MM = new MMViewModel();
            InitializeComponent();                
            DataContext = MM;
            _notifyIcon = new NotifyIcon();
            _notifyIcon.DoubleClick += (s, args) => ShowMainWindow(this);
            _notifyIcon.Icon = Migration_Monitor_v2.Properties.Resources.mmc;
            _notifyIcon.Visible = true;
            Closing += MainWindow_Closing;
            CreateContextMenu();
        }
        catch (Exception e)
        {
            logger.Error("App failed with exception: ", e);
        }
    }
    private void CreateContextMenu()
    {
        _notifyIcon.ContextMenuStrip = new ContextMenuStrip();
        _notifyIcon.ContextMenuStrip.Items.Add("Refresh Data").Click += (s,e) => MM.RefreshData();
        _notifyIcon.ContextMenuStrip.Items.Add("Exit").Click += (s, e) => ExitApplication(this);
    }

refreshdata方法在ViewModel中(从视图中的刷新按钮执行时工作)

    public void RefreshData()
    {
        InfoPanelVisible = Visibility.Hidden;
        InfoSummaryVisible = Visibility.Visible;
        Task.Run(() => LoadData());
        n = DateTime.Now;
        ProgressBarText = "Click a project to show progress";
        ProgressBarValue = 0;
        lastRefresh.Reset();
        lastRefresh.Start();
    }

loaddata方法(以及关联的方法)从RefreshData

调用
    public async void LoadData()
    {
        IsLoading = Visibility.Visible;
        await GetWebApiInfo();
        MonitorData downloadInfo = main;
        try { AssignDataToControls(downloadInfo); }
        catch (Exception e) { Console.WriteLine("Error: " + e); }
        finally { IsLoading = Visibility.Hidden; }
    }
    public void AssignDataToControls(MonitorData mon)
    {
        MainPanel.Clear();
        MonitorText.Clear();
        mon.MainPanel.ToList().ForEach(x => MainPanel.Add(x));
        mon.MonitorText.ToList().ForEach(x => MonitorText.Add(x));
        Information = mon.Information;
        ProgressData = mon.progList;
    }
    public async Task GetWebApiInfo()
    {
        var url = "::::WEB API ADDRESS::::";
        string responseFromServer;
        using (HttpClient _client = new HttpClient())
        using (var dataStream = await _client.GetStreamAsync(url))
        using (var reader = new StreamReader(dataStream, Encoding.Unicode))
            responseFromServer = await reader.ReadToEndAsync();
        var deserializer = new JavaScriptSerializer();
        main = deserializer.Deserialize<MonitorData>(responseFromServer);
    } 

从viewModel commands.cs file

刷新command
internal class RefreshCommand : ICommand 
{
    public RefreshCommand(MMViewModel viewModel)
    {
        _viewModel = viewModel;
    }
    private MMViewModel _viewModel;
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
    public bool CanExecute(object parameter)
    {
        return _viewModel.CanRefresh;
    }
    public void Execute(object parameter)
    {
        _viewModel.RefreshData();
    }
}

解决了此问题。问题是我的ViewModel是在三个单独构造的,因此命令尚不清楚被引用的实例。

为了解决此问题,我删除了XAML窗口定义空间中对ViewModel的引用。我认为我认为ViewModel作为本地名称空间需要2个参考文献(即X:local.vm =" Mm.MyviewModel")。删除这些内容后,ViewModel仅被构造一次,并且所有代码都按预期运行。感谢@Will的帮助,到达了这一点!

最新更新