表达式不会在vb.net应用程序中生成值

时间:2014-07-21 09:54:44

标签: c# .net vb.net winforms mvvm

我有一个Winforms应用程序,我想使用MVVM设计模式:

我遵循此tutorial

这是非常有趣的文章,但是我遇到了这个问题:我的应用程序是vb.net,我将代码(C#)转换为vb.net,除了这个之外它工作正常:

C#代码

 protected void ViewModel_Validated(object sender, EventArgs e)
    {
        this.ViewModel.AttachedControls.ToList().ForEach(c => this.errorProvider.SetError(c.Value as Control, ""));
        if (!string.IsNullOrEmpty(this.ViewModel.Error)) {
            this.ViewModel.Messages.ToList().ForEach(message => {
                this.errorProvider.SetError(this.ViewModel.AttachedControls[message.Key] as Control, message.Value);
            });
        }
    } 

Vb.net代码

 Protected Sub ViewModel_Validated(ByVal sender As Object, ByVal e As EventArgs)
        Me.ViewModel.AttachedControls.ToList().ForEach(Function(c) Me.errorProvider.SetError(TryCast(c.Value, Control), ""))
        If Not String.IsNullOrEmpty(Me.ViewModel.[Error]) Then
            Me.ViewModel.Messages.ToList().ForEach(Function(message)
                                                       Me.errorProvider.SetError(TryCast(Me.ViewModel.AttachedControls(message.Key), Control), message.Value)

                                                   End Function)
        End If
    End Sub

问题出在这一行:

Me.ViewModel.AttachedControls.ToList().ForEach(Function(c) Me.errorProvider.SetError(TryCast(c.Value, Control), ""))

错误:

Expression does not produce a value.

我需要知道

  • 出现此错误的原因是什么?
  • 我该如何解决?

2 个答案:

答案 0 :(得分:9)

Function更改为Sub Function表示返回值的方法,但您的代码:Me.errorProvider.SetError(TryCast(c.Value, Control), "")没有。

来自MSDN:

  

要将值返回给调用代码,请使用Function过程;   否则,使用Sub程序。

所以试试:

Me.ViewModel.AttachedControls.ToList().ForEach(Sub(c) Me.errorProvider.SetError(TryCast(c.Value, Control), ""))

还有下一行你需要改变:

Me.ViewModel.Messages.ToList().ForEach(Sub(message)
                                           Me.errorProvider.SetError(TryCast(Me.ViewModel.AttachedControls(message.Key), Control), message.Value)
                                       End Sub)

答案 1 :(得分:0)

在vb.net中子和函数都是子例程,或者可以在程序中调用的代码段。它们之间的区别在于函数具有返回值而子函数没有。 因此最好将函数更改为sub以避免问题