作为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
这给了我两个具体的错误
当我再次查看Joe发布的原始代码时,似乎没有为'd'传递参数,并且trycast与转换为的大致相同。那么为什么转换为VB时抛出错误呢?
感谢您对此事有任何启发,以及您可能需要纠正的任何建议。
答案 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专家):
VB中没有从C#“方法组”中调用的内容进行委托,因此您必须使用AddressOf运算符
在C#中“as”并不直接转换为VB中的TryCast,因为“as”显式支持可空类型。在这种情况下,DirectCast是一个安全的赌注,因为你负责传递的参数。