Skip to content

🐟 An incredibly lightweight and type safe MVVM library for .NET WPF, Silverlight, Xamarin and UWP

License

Notifications You must be signed in to change notification settings

mrousavy/Jellyfish

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Jellyfish

AppVeyor badge NuGet downloads badge
Buy Me a Coffee at ko-fi.com

🐟

An incredibly light and type safe MVVM library for .NET WPF, Silverlight, Xamarin and UWP

Jellyfish is on NuGet:

PM> Install-Package Jellyfish

Make 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

Usage

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.

πŸ“ View Models

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 πŸ“–

⚑ Commands

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 πŸ“–

πŸ’‰ Dependency Injection

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(); } }

See Dependency Injection πŸ“–

πŸ’Ύ Enums

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 πŸ“–

βš™οΈ Preferences

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 πŸ“–

πŸ”” Feeds

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 πŸ“–

Results

With Jellyfish

public class LoginViewModel : ViewModel { private User _user; public User User { get => _user; set => Set(ref _user, value); } }

Without Jellyfish

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"); } } }

About

🐟 An incredibly lightweight and type safe MVVM library for .NET WPF, Silverlight, Xamarin and UWP

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

  •  

Packages

 
 
 

Contributors 2

  •  
  •