【问题标题】:PRISM 5: ViewModelLocator in VB.NET, implementation of IView not possible in the ViewPRISM 5:VB.NET 中的 ViewModelLocator,视图中无法实现 IView
【发布时间】:2014-09-12 12:47:49
【问题描述】:

我目前正在使用 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

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

【问题讨论】:

    标签: vb.net mvvm prism viewmodellocator


    【解决方案1】:

    尝试:

    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
    

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

    您可以在this SO question上找到更多信息。

    【讨论】:

    • 使用“Shadows”,View 和 ViewModel 之间的连接不起作用。在 getter/setter 中更新基类 Datacontext 属性是可行的,并且似乎是一个很好的解决方案。谢谢。
    • @RaphaëlGodart 是的,这就是我保留依赖属性行为的意思。很高兴帮助:)
    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 2018-10-29
    • 2012-01-29
    • 2016-05-02
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多