2014-10-28 92 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