2014-10-28 132 views
0

作爲wpf和MVVM的新手,對於我偶然發現對話結果這個小問題(或者缺少它)並沒有太長的期限。幸運的是,關於這個主題的問題數量至少讓我感到我並不孤單。將MVVM WPF C#代碼翻譯成vb.net

看過無數的答案,似乎最類似於MVVM原理(至少對我的新的和相對不熟練的眼睛)是由喬懷特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. 私人共享子的參數d沒有指定參數DilogResultChanged
  2. TryCast操作數必須是引用類型,但布爾?是值類型

當我再次查看Joe發佈的原始代碼時,似乎沒有爲'd'傳遞的參數,而且trycast與它已轉換的內容大致相同。那麼,爲什麼在轉換爲VB時拋出錯誤呢?

感謝您提供任何有關此事的信息,以及您可能需要糾正的任何建議。

回答

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. 「as」在C#中不直接轉換爲VB中的TryCast,因爲「as」顯式ly支持可空類型。在這種情況下,DirectCast是一個安全的選擇,因爲您負責傳遞的參數。

+0

非常感謝。我習慣於在c#中替換+ =的AddressOf,但是因爲我沒有看到它,所以我沒有想到。同樣我也應該想到直接投。非常感謝。 – 2014-10-28 11:25:11