1

我目前正在使用 MVVM 模式和 PRISM ViewModelLocator 在 VB.NET 中构建一个 PRISM 5 应用程序。PRISM ViewmodelLocator 需要所有视图来实现 Microsoft.Practises.Prism.Mvvm.IView 接口。这个接口只包含一个属性:DataContext。

由于 View(它是一个 FrameworkElement)已经具有属性 DataContext,在 c# 中,在 View 类名称后面添加“:IView”就足够了,而无需为 DataContext 属性提供新的实现(隐式接口实现)。神奇的是,ViewModel 然后通过 Datacontext 属性自动连接到 View。

在 VB.NET 中这是不可能的,因为您不能进行隐式接口实现。在类的顶部添加“Implements IView”时,VB 指示为 DataContext 属性提供一个实现。由于 FrameworkElement 已经有一个 Datacontext 属性,VB 会自动添加一个 Datacontext1 属性的实现。当然,将 ViewModel 连接到 View 是行不通的。下面是我的代码:

看法

Imports Microsoft.Practices.Prism.Mvvm

Namespace Views
    Class MyWindow
        Inherits Window
        Implements IView

        Public Property DataContext1 As Object Implements IView.DataContext
    End Class
End Namespace

视图模型

Imports Microsoft.Practices.Prism.Mvvm

Namespace ViewModels
    Public Class MyWindowViewModel
        Inherits BindableBase

        Private mTheText As String = "This is the text."

        Public Property TheText() As String
            Get
                Return Me.mTheText
            End Get
            Set(ByVal value As String)
                SetProperty(Of String)(Me.mTheText, value)
            End Set
        End Property
    End Class
End Namespace

有没有围绕这个的最佳实践?

到目前为止,我发现似乎可行的只是将此行添加到我的视图的构造函数中:

Datacontext = Datacontext1

但我发现这是一个非常肮脏的解决方案。

4

1 回答 1

0

尝试:

Public Shadows Property DataContext As Object Implements IView.DataContext

所以你的观点是:

Imports Microsoft.Practices.Prism.Mvvm

Namespace Views
    Class MyWindow
        Inherits Window
        Implements IView

        Public Shadows Property DataContext As Object Implements IView.DataContext
    End Class
End Namespace

但是,如果您希望保留依赖属性行为,您可能需要DataContext在新属性的 getter 和 setter 中更新实际基类的属性。

您可以找到有关此 SO question的更多信息。

于 2014-09-12T13:02:53.520 回答