An incredibly light and type safe MVVM library for .NET WPF, Silverlight, Xamarin and UWP
Jellyfish is on NuGet:
PM> Install-Package JellyfishMake sure to also check out the Jellyfish Visual Studio Extension π¦!
Compared to other MVVM Frameworks like MVVM Light, Prism or Caliburn.Micro, this framework is
- as light as possible
- using modern best-practices
- using modern code style
- using little to no runtime reflection to be as fast as possible
- exactly fitting my needs
For description, documentation and usage, please view the Jellyfish wiki π or the Getting Started guide π. For usage-example projects, please see Jellyfish.Demo or GameFinder.
Every ViewModel needs to implement the ViewModel class:
public class LoginViewModel : ViewModel { private User _user; public User User { get => _user; set => Set(ref _user, value); } }See View Models π
The RelayCommand is an ICommand implementation.
<Window ...> <Button Command="{Binding LoginCommand}" /> </Window>Initialize the ICommand with a non-generic RelayCommand instance and the given action/callback:
ICommand LoginCommand = new RelayCommand(LoginAction, CanLogin); // ... void LoginAction(object parameter) { ... } bool CanLogin(object parameter) { ... }See Commands π
Provide dependencies for types using the IInjector
At app startup:
Injector.Register<IUser>(() => new User("John", "Smith")); Injector.Register<IDatabaseService>(() => OpenDatabaseService(username, password));Some ViewModel:
class LoginViewModel : ViewModel { IUser User { get; set; } IDatabaseService _service; LoginViewModel() { this.Inject(); } }The enum binding source extension allows for better binding support on enums.
Just use the EnumBindingSource extension to bind an enum to any ItemsSource:
<ComboBox ItemsSource="{Binding Source={jellyfish:EnumBindingSource {x:Type local:Status}}}" SelectedItem="{Binding SelectedStatus}" />See Enums π
An abstract class definition for any application Preferences.
public class DemoPreferences : Preferences { public int SomeInt { get; set; } = 400; public string SomeString { get; set; } = "test string"; public bool SomeBool { get; set; } = false; public object SomeObject { get; set; } = new { Name = "Marc", IsValid = true }; }See Preferences π
The IFeed<T> allows notifying any subscribers in this feed about sudden changes within the application domain in realtime.
class CustomViewModel : INode<NotifyReason> { public CustomViewModel { this.Subscribe(); } public void MessageReceived(NotifyReason reason) { ... } } Feed.Notify(NotifyReason.RefreshView);See Feeds π
public class LoginViewModel : ViewModel { private User _user; public User User { get => _user; set => Set(ref _user, value); } }public class LoginViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } private string _username; public string Username { get { return _username; } set { _username = value; OnPropertyChanged("Username"); } } }