代码之家  ›  专栏  ›  技术社区  ›  user134363

MVVM-是否有一个开放源代码视图模型基类?[关闭]

  •  5
  • user134363  · 技术社区  · 16 年前

    我正在使用MVVM,我认为我可以找到一个开源视图模型基类,而不是重新设计轮子。我找不到。

    7 回复  |  直到 14 年前
        1
  •  0
  •   heads5150    16 年前

    微软 Prism . 完全访问源代码。有点陡峭的学习曲线,但是一旦你掌握了它,它就会很好地工作。

        2
  •  6
  •   Chris Koenig    16 年前

    MVVM Light 也是一个很好的解决方案,它有一个非常容易找到的基类:—)

        3
  •  4
  •   Kieren Johnstone    16 年前

    我建议MVVM的基本原理非常简单,这样重新发明轮子就更容易了。您需要的所有基本功能都是让类实现 INotifyPropertyChanged (基类可以具有 OnPropertyChanged(string propertyName) )除此之外还有 RelayCommand 或者类似的-只是一个 ICommand 在中执行委托的实现 Execute .

    总之,只需要几行代码,它就可以保持非常整洁。您还需要什么其他功能?如果要处理潜在的BDO(比如 DataRow , XmlNode 或者poco)那么它不应该真的在vm基类中,而是一个派生类。

    希望有帮助。

        4
  •  0
  •   Tobby    16 年前

    看看Nikhail Kothari的博客,他的silverlightfx库,这是一个开源的MVVM U可能会发现有用的。

        5
  •  0
  •   jbe    16 年前

    这个 WPF Application Framework (WAF) 是开放源代码,包含一个viewModel基类(用于实现模型视图viewModel模式)。

        6
  •  0
  •   Scott Whitlock    16 年前

    SoapBox Core 是一个用于构建可扩展MVVM应用程序的开源(LGPL)MVVM(和MEF)框架。类层次结构包括一个基本的ViewModel类(以及相关的接口)。

        7
  •  -3
  •   ecathell    16 年前

    这是我的一个例子……它不会真正帮助你,因为我想让我的视图模型做的将不同于你想让你的视图模型做的……但也许它会给你一个开始。而基类的问题是,如果你把它放在你的核心中……你只需要写一次……

    Imports System.ComponentModel
    Imports System.Windows
    Imports Microsoft.Practices.Composite.Events
    Imports WavelengthIS.Core.Services
    Imports WavelengthIS.Core.Bases
    Imports Ocean.OceanFramework.CommonDialog
    Imports WavelengthIS.WPF.Events
    
    Namespace WavelengthIS.WPF.Bases
    
        Public MustInherit Class ViewModelBase
            Inherits WavelengthIS.Core.Bases.Base
            Implements IDisposable, INotifyPropertyChanged
    
    #Region " Declarations "
            Private _headerinfo As String
            Private _backgroundworker As BackgroundWorker
    
    #End Region
    
    #Region " Properties "
            Public Property HeaderInfo() As String
                Get
                    Return _headerinfo
    
                End Get
                Set(ByVal value As String)
                    If Not (value Is String.Empty) Or Not (IsNothing(value)) Then
                        _headerinfo = value
                    End If
    
                End Set
            End Property
    
            Protected ReadOnly Property BackGroundWorker() As BackgroundWorker
                Get
                    If _backgroundworker Is Nothing Then
                        _backgroundworker = New BackgroundWorker
                    End If
                    Return _backgroundworker
                End Get
            End Property
    
            Private _isdirty As Boolean = False
            Protected Property IsDirty As Boolean
                Get
                    Return _isdirty
                End Get
                Set(ByVal value As Boolean)
                    If Not Equals(value, _isdirty) Then
                        _isdirty = value
                        If _isdirty = True Then
                            DisableNavigation()
                        Else
                            EnableNavigation()
                        End If
                    End If
                End Set
            End Property
    
            ''' <summary>
            ''' not a databinding property. No need for onpropertychanged notifications
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Protected Property IsLoading As Boolean = False
    
            Private _haschanges As Boolean
            Public Property HasChanges As Boolean
                Get
                    Return _haschanges
                End Get
                Set(ByVal value As Boolean)
                    If Not Equals(value, _haschanges) Then
                        _haschanges = value
                        If value = True Then
                            GetEvent(Of Events.DisableCloseButtonEvent).Publish(True)
                        End If
                        OnPropertyChanged("HasChanges")
                    End If
                End Set
            End Property
    
    
    #End Region
    
    #Region " Dialogs "
            'This is not in Bases because it would cause circular references.
    
            ''' <summary>
            ''' Gets the IDialogService registered with the ServiceContainer.
            ''' use ShowMessage or ShowException in child code.
            ''' </summary>
            Private ReadOnly Property Dialog() As Dialog.IDialogService
                Get
                    Return GetService(Of Dialog.IDialogService)()
                End Get
            End Property
    
            Protected Function ShowMessage(ByVal message As String, ByVal caption As String, ByVal button As Dialog.DialogButton, ByVal image As Dialog.DialogImage) As Ocean.OceanFramework.CommonDialog.CustomDialogResult
                GetEvent(Of Events.DialogShowingEvent).Publish(True)
                Dim rslt As CustomDialogResult = Dialog.ShowMessage(message, caption, button, image)
                GetEvent(Of Events.DialogShowingEvent).Publish(False)
                Return rslt
            End Function
    
            Protected Sub ShowException(ByVal message As String, Optional ByVal expandedMessage As String = Nothing, Optional ByVal image As Dialog.DialogImage = Core.Services.Dialog.DialogImage.Error)
                GetEvent(Of Events.DialogShowingEvent).Publish(True)
                Dialog.ShowException(message, expandedMessage, image)
                GetEvent(Of Events.DialogShowingEvent).Publish(False)
    
            End Sub
    #End Region
    
    #Region " Wait States "
    
            Private ReadOnly Property Wait As WavelengthIS.Core.Services.IWaitingService
                Get
                    Return GetService(Of IWaitingService)()
                End Get
            End Property
    
            Protected Sub BeginWait()
                GetEvent(Of Events.DisplayWaitingControlEvent).Publish(True)
            End Sub
    
            Protected Sub EndWait()
                GetEvent(Of Events.DisplayWaitingControlEvent).Publish(False)
            End Sub
    #End Region
    
    #Region " Events "
            Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    
    
    #End Region
    
    #Region " Constructor "
            Public Sub New()
                _backgroundworker = New BackgroundWorker
                AddHandler _backgroundworker.DoWork, AddressOf BackGroundWorker_DoWork
                AddHandler _backgroundworker.RunWorkerCompleted, AddressOf BackGroundWorker_RunWorkerCompleted
    
            End Sub
    
    #End Region
    
    #Region " IDisposable Support "
    
            Private disposedValue As Boolean = False        ' To detect redundant calls
    
            ' IDisposable
            Protected Overridable Sub Dispose(ByVal disposing As Boolean)
                If Not Me.disposedValue Then
                    If disposing Then
                        ' TODO: free other state (managed objects).
                    End If
    
                    ' TODO: free your own state (unmanaged objects).
                    ' TODO: set large fields to null.
                End If
                Me.disposedValue = True
            End Sub
            ' This code added by Visual Basic to correctly implement the disposable pattern.
            Public Sub Dispose() Implements IDisposable.Dispose
                ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
                Dispose(True)
                GC.SuppressFinalize(Me)
            End Sub
    #End Region
    
    #Region " Debugging Helpers "
            <Conditional("DEBUG")> _
            Public Sub VerifyPropertyName(ByVal propertyName As String)
    
                'If you raise PropertyChanged and do not specify a property name,
                'all properties on the object are considered to be changed by the binding system.
                If String.IsNullOrEmpty(propertyName) Then
                    Return
                End If
    
                ' Verify that the property name matches a real,  
                ' public, instance property on this object.
                'If TypeDescriptor.GetProperties(Me)(propertyName) Is Nothing Then
                '    Dim msg As String = "Invalid property name: " & propertyName
                '    Throw New Exception(msg)
                'End If
            End Sub
    
            Private _ThrowOnInvalidPropertyName As Boolean
            Protected Property ThrowOnInvalidPropertyName() As Boolean
                Get
                    Return _ThrowOnInvalidPropertyName
                End Get
                Private Set(ByVal value As Boolean)
                    _ThrowOnInvalidPropertyName = value
                End Set
            End Property
    
    
    
    
    #End Region
    
    #Region " INotifyProperty Changed Method "
    
    
            Protected Overridable Sub OnPropertyChanged(ByVal strPropertyName As String)
                Me.VerifyPropertyName(strPropertyName)
    
                If Me.PropertyChangedEvent IsNot Nothing Then
                    RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(strPropertyName))
                End If
    
    
            End Sub
    
            Private Function QualifyString(ByVal str As String) As Boolean
    
    
    
                Return True
    
            End Function
    
            Protected Overridable Sub OnPropertyChanged(ByVal strPropertyName As String, ByVal IsPrimaryProperty As Boolean)
                Me.OnPropertyChanged(strPropertyName)
    
            End Sub
    
    #End Region
    
    #Region " Navigation Events "
    
            Protected Sub EnableNavigation()
                'Keep from firing multiple onPropertyChanged events
                If HasChanges = True Then
                    HasChanges = False
                End If
    
                GetEvent(Of DisableNavigationEvent).Publish(False)
    
            End Sub
    
            Protected Sub DisableNavigation()
                'Keep from firing multiple onPropertyChanged events
                If HasChanges = False Then
                    HasChanges = True
                End If
    
                GetEvent(Of DisableNavigationEvent).Publish(True)
    
            End Sub
    
    #End Region
        End Class
    
    End Namespace
    
    推荐文章