1

現在、PRISM ViewModelLocator を使用して、MVVM パターンを使用して VB.NET で PRISM 5 アプリケーションを構築しています。PRISM ViewmodelLocator では、すべてのビューで Microsoft.Practises.Prism.Mvvm.IView インターフェイスを実装する必要があります。このインターフェイスには、DataContext というプロパティが 1 つだけ含まれています。

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、新しいプロパティのゲッターとセッターで実際の基本クラスのプロパティを更新することができます。

この SO questionの詳細については、こちらを参照してください。

于 2014-09-12T13:02:53.520 に答える