c# - 无法在静态上下文中访问非静态方法?

标签 c# wpf mvvm

鉴于此代码....

public class CalibrationViewModel : ViewModelBase
{
    private FileSystemWatcher fsw;

    public CalibrationViewModel(Calibration calibration)
    {
        fsw = new FileSystemWatcher
            {
                Path = @"C:\Users\user\Desktop\Path\ToFile\Test_1234.txt",
                Filter = @"Test_1234.txt",
                NotifyFilter = NotifyFilters.LastWrite
            };

        fsw.Changed += (o, e) =>
            {
                var lastLine = File.ReadAllLines(e.FullPath).Last();
                Dispatcher.BeginInvoke((Action<string>) WriteLineToSamplesCollection, lastLine); //line that cites error
            };
    }

    private void WriteLineToSamplesCollection(string line)
    {
        // do some work
    }
}

为什么我会收到错误“无法在静态上下文中访问非静态方法 BeginInvoke”?

我看过 SE 上的其他几个例子,大多数人都提到在创建对象之前尝试使用字段,就好像他们试图以静态方式使用非静态字段一样,但我不明白它是什么是关于调用相同错误的我的代码。

最后,我该如何解决这个特定问题/代码?

更新:修复了标题以反射(reflect)“方法”而非“属性”的问题。我还添加了该类实现 ViewModelBase。

最佳答案

如果这是 WPF,System.Windows.Threading.Dispatcher 没有静态 BeginInvoke() 方法。

如果您想静态地调用它(即,没有对 Dispatcher 实例本身的引用),您可以使用静态 Dispatcher.CurrentDispatcher 属性:

Dispatcher.CurrentDispatcher.BeginInvoke(...etc);

请注意,从后台线程执行此操作不会返回对“UI 线程”的 Dispatcher 的引用,而是创建一个与所述后台线程关联的新 Dispatcher 实例。

访问“UI 线程”的 Dispatcher 的一种更安全的方法是使用 System.Windows.Application.Current 静态属性:

Application.Current.Dispatcher.BeginInvoke(...etc);

关于c# - 无法在静态上下文中访问非静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16904830/

相关文章:

wpf - .NET 委托(delegate)平等?

c# - 为什么 IDependecyResolver.Resolve<IUICompositionService>() 方法会抛出异常 'Catel.IoC.TypeNotRegisteredException' ?

wpf - 在大型项目和 MVVM 中使用 Microsoft(或其他)功能区

c# - 在 WPF MVVM 中过滤 ObservableCollection

c# - 从不使用标签控件的对话框中获取文本?

c# - 为了避免 SQL Server 中的 SQL 注入(inject)攻击,应从字符串中转义哪些字符?

c# - 安装向导中的数据库连接

wpf - 如何在 RichTextBox 中设置内联图像垂直居中

c# - 在 X 轴中将 CartesianChart 与 DateAxis 和 DateModel 结合使用

c# - 用列表分离模型