Caliburn.Micro Xaml made easy

Often unseen contributions

Lately I’ve been thinking about the work that goes into producing open source software and the often unseen contributions people and companies make. These companies provide software often for free to open source projects for often little thanks.

So here’s a quick list of the unseen / not really thought about support provided to Caliburn.Micro.

  • JetBrains provides a much needed open source license to Resharper.
  • GitHub provides Git hosting for the source and the hosting for this website.
  • Microsoft provides VSTS hosting for an experimental (at the moment) build server, an MSDN license for Visual Studio Enterprise and access to product teams for assistance.
  • The various control companies Telerik, Syncfusion and Infragistics, with access to the control libraries assists with testing.
  • Xamarin - When Xamarin was an independent company they provided a Business license.

Without their help I doubt we’d be able to have the software we have today, nor be in a position for even more change in the future.

Roadmap announced

Today I’ve published the Roadmap for Caliburn.Micro, this will help codify the direction over the first half of the year. The idea is to sketch out in broad strokes the areas that will be focussed on and what will be needed.

I’m considering trying out GitHub projects to help drive development effort for these broad sections.

Have a read and let me know what you think.

Caliburn.Micro 3.0.2 released

This is a minor bug fix release.

  • Fixed support for child view models at design time. #214, #358, #359, #379
  • Caliburn.Micro.Xamarin.Forms nuget package now depends on Caliburn.Micro for applications helping to ensure you have all the right packages. #323
  • Stopped extra calls to InitializeComponent in Xaamarin.Forms. #326
  • Support .NET 4.0 in the Caliburn.Micro.Start nuget package. #348
  • Ensure view model activation and deactivation is happening on back navigation in Xamarin.Forms. #342
  • ContentView bindings correctly deal with message targets in Xamarin.Forms. #349
  • Convention added for DocumentViewer in WPF. #368
  • Added some generic overloads to methods on SimpleContainer. #390
  • ViewLocator will now correctly call GetInstance for resolution of the view falling back to manual instantiation. #339

The highest impact bug fix for this release is the last one, previously the ViewModelLocator would call GetInstance to try to resolve the view model (falling back to GetAllInstances and then manual instantiation), ViewLocator however previously only called GetAllInstances.

This release makes them consistent, however it could cause problems if you’re throwing exceptions on no resolution of a service from the container. I’d recommend if you are doing this checking whether the type is assignable to UIElement (or some view type) and return null (or skip throwing the exception).

Caliburn.Micro 3.0.1 released

This is a minor bug fix release.

  • Update the assembly version to match the nuget package version - #299
  • BindingScope updated to deal with MenuFlyoutSubItem in UWP - #308

Caliburn.Micro 3.0.0 released

I’m really pleased to finally announce the release of Caliburn.Micro 3.0.0 after a long period of being in beta. The major features of 3.0.0 are Windows 10 / UWP and Xamarin.Forms support. With this release you can use your view models across all major platforms that support C#!

It’s important to note this is a change in the major versions to there may be breaking changes.

Windows 10

The Windows 10 release follows along with the Windows 8.1 and Windows Phone 8.1 releases and combines them into a single library which is great from a maitenance perspective. If we need to start adding features specific to Phone, Xbox or even HoloLens they’ll be done using feature detection via Windows.Foundation.Metadata.ApiInformation.

It includes conventions for new controls such as SplitView.

Also included is a sample showing how to set up a SplitView style app with the Frame not being the root visual but inside the ShellView, this sample is available at Hello UWP.

We now use the new open sourced XAML Behaviours package.

Windows 8.1

  • Fix for transparent tiles in App Manifest Helper

Windows 8.0

This release drops support for Windows 8.0 (different from Windows 8.1).

Xamarin Forms

This release brings support for Xamarin.Forms which in abstraction layer over the different UIs in iOS, Android and Windows Phone Silverlight (Windows 8 / 10 support coming later). What’s really interesting is that it comes with it’s own XAML syntax (not the same as Windows XAML but very similar), this means we can get a closer to standard Caliburn.Micro experience. I was pleasantly surprised by how much I got ported reasonable easy.

There are some limitations of the Xamarin.Forms flavour of of XAML, primarily there is no programmatic access to x:Name mean we cannot support named based conventions. We can still support attached properties such as cm:Message.Attach as well as convention based view / view model location.

<ListView ItemsSource="{Binding Features}" HasUnevenRows="True"
          cm:Message.Attach="[Event ItemSelected] = [ShowFeature($selectedItem)]">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <ContentView cm:View.Model="{Binding}" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"/>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Also included is the now standard navigation service and navigation helper methods

navigationService.For<ProductViewModel>()
    .WithParam(v => v.ProductId, 42)
    .Navigate();

A sample of this sort of app is can be found at Hello.Forms in the GitHub repository.

One of the more interesting features here is that Xamarin.Forms runs on top of the existing mobile platform (Xamarin.iOS, Xamarin.Android and Windows Phone Silverlight). This makes it the first version where two different platforms of Caliburn.Micro have to run side by side. We essentially have two instances of ViewModelLocator, one in Caliburn.Micro.ViewModelLocator for the current host platform and one at Caliburn.Micro.Xamarin.Forms.ViewModelLocator if Xamarin.Forms is present.

Xamarin.iOS and Xamarin.Android

This release primarily targets Xamarin.Forms, however work has been done to allow your view models to be reused within a Xamarin.iOS or Xamarin.Android applications with no support around binding or conventions.

These features will be added in later feature releases.

A sample of this sort of app is can be found at Hello.Xamarin in the GitHub repository.

Preserving State

One new feature in this release is the CachingFrameAdapter. This subclass of FrameAdapter (which implements INavigationService in WinRT platforms such as Windows 8.1, Windows Phone 8.1 and Windows 10) will cache internally view models and reuse them on the appropriate navigation. This allows scenarios where the built in NavigationCacheMode doesn’t make sense but still preserve your view model state. A sample of this in action is available at Caliburn.Micro.State.

Other Changes

  • Resolved a WPF bug using MainWindow when it’s disposed.
  • Resolved ViewLocator.LocateForModelType failing to deal with improperly reused views in WinRT.
  • Resolved a premature garbage collection issue in Action.Invoke.
  • Removed a unnecessary explicate collection in FrameAdapter.
  • BindingScope has been cleaned up a lot so will be easier to extend.
  • Async methods are now taken into account for conventions. CanLogin will be used as a guard for LoginAsync and will be attached to a control with xName="Login".
  • Better handling of scenarios where a root frame is not being used with the navigation service.
  • Removed the case sensitivity when adding custom special values to MessageBinder.
  • Screen.IsActive, Screen.IsInitialised and PropertyChangedBase.IsNotifying are now virtual, we don’t see then behaviour being overriden but a lot apps will need to add their own custom attributes to these properties.

Breaking Changes

  • The extensions projects have moved into the main platform assembly, these were initially created as a place for very platform specific code but they’ve outlived there usefulness and removing them reduces some maintenance costs.
  • Bind.Model had a feature enabling you to pass a string which used IoC to find the model. This was deprecated in 2.0.0 and has now been removed.
  • SimpleContainer now only uses public constructors.
  • The UriFor method has been deprecated in favour of just For given the lack of uri support on a number of platforms.
  • WinRT platforms now make use of AssemblySourceCache which means if your view models do not implement INotifyPropertyChanged or views subclass from UIElement then they may not be found by ViewLocator or ViewModelLocator. This behaviour can be changed by modifying AssemblySourceCache.ExtractTypes.

Thanks

Thank you to all who have contributed fixes, reported issues and generally feedback on the extended pre-release versions.

As well a bit thanks to Marker Metro who sponsored a lot of the time it took me to put this 3.0.0 release together.