将MVVM WPF C#代码翻译为vb.net

时间:2014-10-28 10:38:16

标签: c# wpf vb.net mvvm

作为wpf和MVVM的新手,我花了很长时间才能偶然发现对话结果的小问题(或者更确切地说是缺乏对话结果)。幸运的是,SO中关于这个主题的问题数量至少让我觉得我并不孤单。

看过无数的答案之后,似乎最接近MVVM的原则(至少对我的新人和相对不熟练的人来说)是Joe White here给出的答案。

到目前为止一直很好,直到将它翻译成VB的小问题。

我最终得到的是这个;

Imports System.windows

Public NotInheritable Class DialogCloser
     Private Sub New()
        End Sub
        Public Shared ReadOnly DialogResultProperty As DependencyProperty = DependencyProperty.RegisterAttached("DialogResult", GetType(System.Nullable(Of Boolean)), GetType(DialogCloser), New PropertyMetadata(DialogResultChanged))

        Private Shared Sub DialogResultChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
            Dim window = TryCast(d, Window)
            If window IsNot Nothing Then
                window.DialogResult = TryCast(e.NewValue, System.Nullable(Of Boolean))
            End If
        End Sub
        Public Shared Sub SetDialogResult(target As Window, value As System.Nullable(Of Boolean))
            target.SetValue(DialogResultProperty, value)
        End Sub

End Class

这给了我两个具体的错误

  1. 未为私有共享子DilogResultChanged
  2. 的参数d指定参数
  3. TryCast操作数必须是引用类型,但布尔值?是值类型
  4. 当我再次查看Joe发布的原始代码时,似乎没有为'd'传递参数,并且trycast与转换为的大致相同。那么为什么转换为VB时抛出错误呢?

    感谢您对此事有任何启发,以及您可能需要纠正的任何建议。

1 个答案:

答案 0 :(得分:1)

以下是可行的:

Public Shared ReadOnly DialogResultProperty As DependencyProperty = DependencyProperty.RegisterAttached(
    "DialogResult",
    GetType(System.Nullable(Of Boolean)),
    GetType(DialogCloser),
    New PropertyMetadata(New PropertyChangedCallback(AddressOf DialogResultChanged)))

Private Shared Sub DialogResultChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
    Dim window = TryCast(d, Window)
    If window IsNot Nothing Then
        window.DialogResult = DirectCast(e.NewValue, Nullable(Of Boolean))
    End If
End Sub

代码中的问题是(据我所知,我不是VB专家):

  1. VB中没有从C#“方法组”中调用的内容进行委托,因此您必须使用AddressOf运算符

  2. 在C#中“as”并不直接转换为VB中的TryCast,因为“as”显式支持可空类型。在这种情况下,DirectCast是一个安全的赌注,因为你负责传递的参数。