Ich arbeite mit MVVM und anstatt das Rad neu zu erfinden, dachte ich, ich könnte eine Open-Source-Ansicht Modell Basisklasse finden. Ich kann keinen finden.MVVM - Gibt es eine Open Source View Model Basisklasse?
Antwort
Microsoft Prism. Voller Zugriff auf den Quellcode. Ein bisschen eine steile Lernkurve, aber sobald Sie einen Griff davon bekommen, funktioniert es wirklich gut.
Die steile Lernkurve flacht ab, wenn Sie gute Kenntnisse über OO und Entwurfsmuster haben und wenn Sie zuvor mit der Abhängigkeitsinjektion gearbeitet haben. –
Hat Prism tatsächlich eine ViewModel-Basisklasse? Ich habe Prism für ein paar Projekte verwendet, und ich bin nie wirklich auf das gestoßen ... – BFree
Gleiche Frage: Wie greife ich auf das Basis-ViewModel in Prism zu? In welcher Assembly/Namespace ist es? –
Ich würde vorschlagen, dass die Grundprinzipien von MVVM so einfach sind, dass es einfacher wäre, das Rad neu zu erfinden. Alle grundlegenden Funktionen, die Sie benötigen, müssen von der Klasse implementiert werden: INotifyPropertyChanged
(die Basisklasse könnte die standardmäßige Implementierung von OnPropertyChanged(string propertyName)
haben). Darüber hinaus gibt es die RelayCommand
oder ähnlich - nur eine ICommand
Implementierung, die einen Delegaten in Execute
ausführt.
Alles in allem, nur ein paar Zeilen Code, und es hält es sehr ordentlich. Welche andere Funktionalität suchen Sie? Wenn es mit dem zugrunde liegenden BDO zu tun hat (etwa DataRow
, oder POCO), sollte es nicht wirklich in der VM-Basisklasse sein, sondern eine abgeleitete Klasse.
Hoffe, dass hilft.
Schauen Sie sich Nikhail Kotharis Blog für seine SilverlightFX-Bibliothek, es ist eine Open Source MVVM Sie möglicherweise nützlich finden.
MVVM Light ist auch eine gute Lösung, und es hat eine wirklich einfache Basisklasse zu finden :-)
Ich wünschte wirklich, ich wüßte das, bevor ich meinen Vorschlag vorbringe ;-) – heads5150
Hier ist ein Beispiel von mir ist ... das es Sie nicht wirklich helfen, denn ich will meine Viewmodels wollen Das wird anders sein als das, was du mit deinen Viewmodels machen willst ... aber vielleicht wird es dir einen Anfang geben. Und die Sache mit der Basisklasse ist, wenn Sie es in Ihrem Core-Stick ... Sie haben es nur einmal zu schreiben ...
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
Diese Frage ist mit C# getaggt. – Mizipzor
Die WPF Application Framework (WAF) ist Open Source und enthält eine Ansichtsmodell Basisklasse (für Implementieren des Model-View-ViewModel-Musters).
SoapBox Core ist ein Open Source (LGPL) MVVM (und MEF) Framework für die Erstellung erweiterbarer MVVM-Anwendungen. Die Klassenhierarchie enthält eine Basis-ViewModel-Klasse (und eine Schnittstelle für diese Angelegenheit).
- 1. Gibt es eine Open-Source-Animationsbibliothek?
- 2. Gibt es eine Open-Source-AI-Engine?
- 3. MVVM Access Model von View
- 4. Gibt es Open Source Tower Defense Spiele?
- 5. Gibt es Open Source-Verilog-Grammatiken?
- 6. Gibt es Open Source-Software wie cpanel?
- 7. Gibt es eine gute Open-Source-abstrakte Lastenausgleichsbibliothek für Java?
- 8. Gibt es eine Open-Source-Implementierung von APL?
- 9. Gibt es eine Open-Source-Poker-bezogene Mathematikbibliothek?
- 10. Gibt es eine Open-Source-Real-Roadmap-Routing-Implementierung?
- 11. Gibt es eine Open-Source-Alternative für StreamBase?
- 12. Gibt es eine gute Referenz (Open-Source) Rails NoSQL-Anwendungen?
- 13. Gibt es eine Open Source Augmented Reality SDK für Android?
- 14. Gibt es eine Open-Source-Alternative zum Stack Overflow-Modell?
- 15. Gibt es eine Open-Source-Webanwendung mit AngularJS?
- 16. Gibt es eine gute Open Source XML IDE?
- 17. Gibt es eine Open-Source-WebSockets (JavaScript) XMPP-Bibliothek?
- 18. Gibt es eine Open Source-Version des Facebook Ads-Managers?
- 19. Gibt es einen Football Manager Open Source in Ruby?
- 20. Gibt es einen guten Open-Source-EDIFACT-Parser in Java?
- 21. Welches Open-Source-Node.js-CI-Projekt gibt es?
- 22. Gibt es gute Open Source-Projekte, die auf Rails3 basieren?
- 23. Gibt es einen Open Source Profiler für .Net 4?
- 24. Gibt es Open-Source-Check-in/Check-out-Systeme?
- 25. Gibt es einen Open-Source-Access-ODBC-Treiber für Linux?
- 26. Gibt es irgendwo Open-Source-Projekte, die nach Mitwirkenden suchen?
- 27. Gibt es Open Source für den Ip Tunnel?
- 28. Gibt es ein Open Source SQL Server DB-Vergleichstool?
- 29. Gibt es Open-Source-Projekte mit DDD (Domain Driven Design)?
- 30. Gibt es inverse Kinematik-Bibliotheken von Open Source AS3?
Was suchen Sie in dieser Basisklasse? –