# Catel.Templates **Repository Path**: eastmike/Catel.Templates ## Basic Information - **Project Name**: Catel.Templates - **Description**: No description available - **Primary Language**: C# - **License**: MIT - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-18 - **Last Updated**: 2026-03-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Catel.Templates =============== This repository contains the item and project templates for Catel. The easiest way to get the code snippets is by installing them via the Visual Studio Marketplace. ## Code Snippets ### Log Generates a static `ILog` instance for the current class. Usage: `log` Output: ``` private static readonly ILog Log = LogManager.GetCurrentClassLogger(); ``` ### Model Creates a new model based on the `ModelBase` class. Usage: `model` Output: ``` [Serializable] public class MyModel : ModelBase { public MyModel() { } // TODO: Define your custom properties here using the 'modelprop' code snippet } ``` ### Model property Creates a model property for a class based on `ModelBase`. Usage: `modelprop` or `modelpropfody` Output: ``` public string FirstName { get { return GetValue(FirstNameProperty); } set { SetValue(FirstNameProperty, value); } } public static readonly PropertyData FirstNameProperty = RegisterProperty(nameof(FirstName), typeof(string), null); ``` ### Model property with change notifications Creates a model property for a class based on `ModelBase` and includes a property change notification method. Usage: `modelpropchanged` or `modelpropchangedfody` Output: ``` public string FirstName { get { return GetValue(FirstNameProperty); } set { SetValue(FirstNameProperty, value); } } public static readonly PropertyData FirstNameProperty = RegisterProperty(nameof(FirstName), typeof(string), null, (sender, e) => ((ContainingClass)sender).OnFirstNameChanged()); private void OnFirstNameChanged() { // TODO: Implement logic } ``` ### View model Creates a view model class based on the `ViewModelBase`. Usage: `vm` Output: ``` public class MainViewModel : ViewModelBase { public MainViewModel() { } public override string Title { get { return "Main"; } } // TODO: Register properties using 'vmprop' // TODO: Register properties that represent models using 'vmpropmodel' // TODO: Register properties that map to models using 'vmpropviewmodeltomodel' // TODO: Register commands using 'vmcommand', 'vmcommandwithcanexecute', 'vmtaskcommand' or 'vmtaskcommandwithcanexecute' protected override async Task InitializeAsync() { await base.InitializeAsync(); // TODO: Add initialization logic like subscribing to events } protected override async Task CloseAsync() { // TODO: Add uninitialization logic like unsubscribing from events await base.CloseAsync(); } } ``` ### View model property Creates a view model class based on the `ViewModelBase`. Usage: `vmprop` or `vmpropfody` Output: ``` public string FirstName { get { return GetValue(FirstNameProperty); } set { SetValue(FirstNameProperty, value); } } public static readonly PropertyData FirstNameProperty = RegisterProperty(nameof(FirstName), typeof(string), null); ``` ### View model property with change notifications Creates a view model property for a class based on `ViewModelBase` and includes a property change notification method. Usage: `vmpropchanged` or `vmpropchangedfody` Output: ``` public string FirstName { get { return GetValue(FirstNameProperty); } set { SetValue(FirstNameProperty, value); } } public static readonly PropertyData FirstNameProperty = RegisterProperty(nameof(FirstName), typeof(string), null, (sender, e) => ((ContainingClass)sender).OnFirstNameChanged()); private void OnFirstNameChanged() { // TODO: Implement logic } ``` ### View model property as model Creates a view model property decorated with the `Model` attribute. Usage: `vmpropmodel` or `vmpropmodelfody` Output: ``` [Model] public Human Person { get { return GetValue(PersonProperty); } private set { SetValue(PersonProperty, value); } } public static readonly PropertyData PersonProperty = RegisterProperty(nameof(Person), typeof(Human)); ``` ### View model property with view model to model mapping Creates a view model property with a mapping to a model. Usage: `vmpropviewmodeltomodel` or `vmpropviewmodeltomodelfody` Output: ``` [ViewModelToModel(nameof(Person))] public string FirstName { get { return GetValue(FirstNameProperty); } set { SetValue(FirstNameProperty, value); } } public static readonly PropertyData FirstNameProperty = RegisterProperty(nameof(FirstName), typeof(string)); ``` ### View model command Creates a view model command with an execute method. Usage: `vmcommand` Output: ``` public Command MyCommand { get; private set; } // TODO: Move code below to constructor MyCommand = new Command(OnMyCommandExecute); // TODO: Move code above to constructor private void OnMyCommandExecute() { // TODO: Handle command logic here } ``` ### View model command with can execute Creates a view model command with an execute and can execute method. Usage: `vmcommandwithcanexecute` Output: ``` public Command MyCommand { get; private set; } // TODO: Move code below to constructor MyCommand = new Command(OnMyCommandExecute, OnMyCommandCanExecute); // TODO: Move code above to constructor private bool OnMyCommandCanExecute() { return true; } private void OnMyCommandExecute() { // TODO: Handle command logic here } ``` ### View model task command Creates a view model task-based command with an execute method. Usage: `vmtaskcommand` Output: ``` public TaskCommand MyCommand { get; private set; } // TODO: Move code below to constructor MyCommand = new TaskCommand(OnMyCommandExecuteAsync); // TODO: Move code above to constructor private async Task OnMyCommandExecuteAsync() { // TODO: Handle command logic here } ``` ### View model task command with can execute Creates a view model task-based command with an execute and can execute method. Usage: `vmtaskcommandwithcanexecute` Output: ``` public TaskCommand MyCommand { get; private set; } // TODO: Move code below to constructor MyCommand = new TaskCommand(OnMyCommandExecuteAsync, OnMyCommandCanExecute); // TODO: Move code above to constructor private bool OnMyCommandCanExecute() { return true; } private async Task OnMyCommandExecuteAsync() { // TODO: Handle command logic here } ``` ## Templates TODO: Describe all templates ## How to ensure local templates show up Open the Visual Studio command prompt in administrator mode and run the command below: ``` devenv /installvstemplates ``` ## How to contribute? We love improvements to the templates via contributions. Below is a guide that should help you set up your environment. 1. Copy the templates from the repository to VS 2019 Use the `scripts - Copy templates to VS2019.ps1` script or manually copy the templates from `/templates/` to `%documents%\Visual Studio 2019\`. **Note that they should be put in the right directory. If you are not sure, always use the script.** 2. Update and test the templates To customize the templates, edit the files in `%documents%\Visual Studio 2019\Templates`. Once customized, you can directly test them in Visual Studio. 3. Copy the changes back To copy the updated templates back to the solution, use the script `scripts - Copy templates from VS2019.ps1` or manually copy the templates from `%documents%\Visual Studio 2019\` to `/templates/`. 4. Zip the templates and copy the templates to the VSIX projects To zip and copy the templates, use the script `scripts - Copy templates to VSIX projects.ps1` 5. Create a PR (Pull Request) with the changes for review.