0

I get the following mysterious error when trying to use ReactiveUI's MVVM framework in a Windows Store app:

Error: Converter failed to convert value of type 'ReactiveUI.RoutingState, ReactiveUI, 
Version=5.4.0.0, Culture=neutral, PublicKeyToken=null' to type 'IRoutingState'; 
BindingExpression: Path='Router' DataItem='MVVMTestWS.AppBootstrapper'; target element 
is 'ReactiveUI.Xaml.RoutedViewHost' (Name='null'); target property is 'Router' 
(type 'IRoutingState'). 

The Xaml looks like the following:

<Page
    x:Class="MVVMTestWS.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MVVMTestWS"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:Xaml="using:ReactiveUI.Xaml"
    mc:Ignorable="d">
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Xaml:RoutedViewHost Router="{Binding Router}"  HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" />
    </Grid>
</Page>

The AppBootstrapper object looks like the following:

public class AppBootstrapper : ReactiveObject, IScreen
{
    public IRoutingState Router { get; private set; }

    public AppBootstrapper(IMutableDependencyResolver dependencyResolver = null, IRoutingState testRouter = null)
    {
        Router = testRouter ?? new RoutingState();
        dependencyResolver = dependencyResolver ?? RxApp.MutableResolver;

        // Bind 
        RegisterParts(dependencyResolver);

        // TODO: This is a good place to set up any other app 
        // startup tasks, like setting the logging level
        LogHost.Default.Level = LogLevel.Debug;

        // Navigate to the opening page of the application
        Router.Navigate.Execute(new HomePageVM(this));
    }

The error mystifies me! Router is clearly declared IRoutingState, I've checked that it isn't null, and I've done my best to make sure there aren't two definitions of it floating around. There was some chatter on the web about WS apps having trouble binding to interfaces, but ICommand in a Button works just fine (I tested it in the same project).

This is a dirt simple WS app built for Win 8.1 using VS2013. I'm using the 5.4.0 release of ReactiveUI (if that makes a difference here). I am a newbie when it comes to writing WS apps. Any suggestions of what I've done wrong or what more I can do to help debug this would be most helpful!

Gordon
  • 3,012
  • 2
  • 26
  • 35

1 Answers1

0

Computers are weird. Just make it the concrete class RoutingState, the interface is probably going away in ReactiveUI 6 anyways

Ana Betts
  • 73,868
  • 16
  • 141
  • 209
  • Thanks, Paul. Not sure what you mean, however. IScreen demands there be a IRoutingState interface. I tried a hack: I just had Router be the concrete RoutingState class, and then had the IScreen interface implemented explicitly (IScreen.Router). The binding takes place to the concrete Router in that case. However, I still get the same error. – Gordon Dec 30 '13 at 21:33
  • Does 1st chance exceptions reveal anything interesting? – Ana Betts Jan 04 '14 at 06:35