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

时间:2013-06-03 19:57:48

标签: 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上的其他几个例子,并且大多数人试图在创建对象之前尝试使用字段,好像他们试图以静态方式使用非静态字段,但我不明白它是什么是关于我的代码调用相同的错误。

最后,我该怎么做才能修复此特定问题/代码?

更新:修正标题以反映“方法”而非“财产”的问题。我还补充说,该类实现了ViewModelBase。

3 个答案:

答案 0 :(得分:32)

如果这是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);

答案 1 :(得分:8)

改变这个:

Dispatcher.BeginInvoke

到此:

Dispatcher.CurrentDispatcher.BeginInvoke

问题是BeginInvoke是一个实例方法,需要一个实例来访问它。但是,您当前的语法是尝试以BeginInvoke的方式在类static之外访问Dispatcher,这就是造成此错误的原因:

  

无法在静态上下文中访问非静态方法BeginInvoke

答案 2 :(得分:3)

这是因为Dispatcher是一个类而不是一个属性。你不应该让你的CalibrationViewModel类成为其他具有Dispatcher属性的类的子类吗?