Frage

I'm a xaml novice and pretty new to WPF/Store apps. I tried to create a simple example of Caliburn Micro (compiled on the recent code) for a Windows 8.1 Store app. But I was unable to get it running as since yesterday I'm getting the error - No target found for method X I did tried the samples under the source I'd downloaded, they just work fine. Same I tried to create from scratch, it throws the aforementioned exception. Here is the code of the entire solution, please correct me if I've configured/used it wrong!

CalMicSample\App.xaml:

<caliburn:CaliburnApplication
    x:Class="CalMicSample.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:caliburn="using:Caliburn.Micro"
    RequestedTheme="Light">

</caliburn:CaliburnApplication>

CalMicSample\App.xaml.cs

using Caliburn.Micro;
using CalMicSample.ViewModels;
using CalMicSample.Views;
using System;
using System.Collections.Generic;
using Windows.ApplicationModel.Activation;
using Windows.UI.Xaml.Controls;

namespace CalMicSample
{
    public sealed partial class App 
    {
        private WinRTContainer container;
        private INavigationService navigationService;

        public App()
        {
            InitializeComponent();
        }

        protected override void Configure()
        {
            LogManager.GetLog = t => new DebugLog(t);

            container = new WinRTContainer();
            container.RegisterWinRTServices();

            container.RegisterSharingService();
            container
                .PerRequest<MyTestViewModel>();

            PrepareViewFirst();
        }

        protected override object GetInstance(Type service, string key)
        {
            var instance = container.GetInstance(service, key);
            if (instance != null)
                return instance;
            throw new Exception("Could not locate any instances.");
        }

        protected override IEnumerable<object> GetAllInstances(Type service)
        {
            return container.GetAllInstances(service);
        }

        protected override void BuildUp(object instance)
        {
            container.BuildUp(instance);
        }

        protected override void PrepareViewFirst(Frame rootFrame)
        {
            navigationService = container.RegisterNavigationService(rootFrame);
        }

        protected override void OnLaunched(LaunchActivatedEventArgs args)
        {
            Initialize();

            var resumed = false;

            if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
            {
                resumed = navigationService.ResumeState();
            }

            if (!resumed)
                DisplayRootView<MyTestView>();
        }
    }
}

CalMicSample\Helpers\ViewModelHelper.cs

using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

namespace CalMicSample.Helpers
{
    public static class ViewModelHelper
    {
        public static bool Set<TProperty>(
            this INotifyPropertyChangedEx This,
            ref TProperty backingField,
            TProperty newValue,
            [CallerMemberName] string propertyName = null)
        {
            if (This == null)
                throw new ArgumentNullException("This");
            if (string.IsNullOrEmpty(propertyName))
                throw new ArgumentNullException("propertyName");

            if (EqualityComparer<TProperty>.Default.Equals(backingField, newValue))
                return false;

            backingField = newValue;
            This.NotifyOfPropertyChange(propertyName);
            return true;
        }
    }
}

CalMicSample\Models\MonkeyMood.cs

namespace CalMicSample.Models
{
    public class MonkeyMood
    {
        public string Message { get; set; }
        public string ImagePath { get; set; }
    }
}

CalMicSample\ViewModels\MyTestViewModel.cs

using Caliburn.Micro;
using CalMicSample.Helpers;
using CalMicSample.Models;
using System;

namespace CalMicSample.ViewModels
{
    public class MyTestViewModel : ViewModelBase
    {
        private string food;
        private MonkeyMood mood;


        public MyTestViewModel(INavigationService navigationService)
            : base(navigationService)
        {

        }

        public string Food 
        { 
            get 
            { 
                return food; 
            } 
            set 
            { 
                this.Set(ref food, value);
            } 
        }
        public MonkeyMood Mood 
        { 
            get 
            {
                return mood;
            } 
            set 
            { 
                this.Set(ref mood, value);
            }
        }

        public void FeedMonkey(string monkeyFood)
        {
            if (string.Compare(Food, "banana", StringComparison.CurrentCultureIgnoreCase) == 0)
            {
                Mood = new MonkeyMood();
                Mood.Message = "Monkey is happy!";
                Mood.ImagePath = @"D:\Tryouts\CaliburnMicroSample\CalMicSample\CalMicSample\Assets\monkey-happy.jpg";
            }
            else
            {
                Mood = new MonkeyMood();
                Mood.Message = "Monkey is unhappy";
                Mood.ImagePath = @"D:\Tryouts\CaliburnMicroSample\CalMicSample\CalMicSample\Assets\monkeysad.jpg";
            }
        }

        public bool CanFeedMonkey(string monkeyFood)
        {
            return !string.IsNullOrWhiteSpace(monkeyFood);
        }
    }
}

CalMicSample\ViewModels\ViewModelBase.cs

using Caliburn.Micro;

namespace CalMicSample.ViewModels
{
    public abstract class ViewModelBase : Screen
    {
        private readonly INavigationService navigationService;

        protected ViewModelBase(INavigationService navigationService)
        {
            this.navigationService = navigationService;
        }

        public void GoBack()
        {
            navigationService.GoBack();
        }

        public bool CanGoBack
        {
            get
            {
                return navigationService.CanGoBack;
            }
        }
    }
}

CalMicSample\Views\MyTestView.xaml

<Page
    x:Class="CalMicSample.Views.MyTestView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:CalMicSample.Views"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:caliburn="using:Caliburn.Micro"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="171*"/>
            <RowDefinition Height="86*"/>
            <RowDefinition Height="382*"/>
            <RowDefinition Height="129*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="172*"/>
            <ColumnDefinition Width="328*"/>
            <ColumnDefinition Width="183*"/>
        </Grid.ColumnDefinitions>
        <Button x:Name="FeedMonkey" Content="Feed" caliburn:Message.Attach="FeedMonkey" Grid.Column="2" HorizontalAlignment="Left" Height="72" Margin="7,7,0,0" Grid.Row="1" VerticalAlignment="Top" Width="138" FontSize="36"/>
        <TextBox x:Name="txtFood" Grid.Column="1" HorizontalAlignment="Left" Height="66" Margin="10,10,0,0" Grid.Row="1" TextWrapping="Wrap" Text="Banana" VerticalAlignment="Top" Width="636" FontSize="36"/>
        <TextBlock x:Name="lblFeedMonkey" Grid.Column="1" HorizontalAlignment="Left" Margin="10,119,0,5" TextWrapping="Wrap" Text="Give some food to the monkey" Width="636" FontSize="36" FontWeight="Bold"/>
        <TextBlock x:Name="lblMonkeyMood" Grid.Column="1" HorizontalAlignment="Center" Margin="59,25,37,10" Grid.Row="3" TextWrapping="Wrap" VerticalAlignment="Center" Height="94" Width="560" FontSize="72"/>
        <Image x:Name="imgMonkey" Grid.Column="1" HorizontalAlignment="Left" Height="362" Margin="10,10,0,0" Grid.Row="2" VerticalAlignment="Top" Width="636"/>

    </Grid>
</Page>

CalMicSample\Views\MyTestView.xaml.cs

using Windows.UI.Xaml.Controls;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace CalMicSample.Views
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MyTestView : Page
    {
        public MyTestView()
        {
            this.InitializeComponent();
        }
    }
}
War es hilfreich?

Lösung

Your feedmonkey method in your vm wants a string parameter, but your not supplying one when attaching to your button. See here for more info: http://caliburnmicro.codeplex.com/wikipage?title=Cheat%20Sheet

Andere Tipps

Rob is correct, you need to match the method signature of your FeedMonkey(string monkeyFood), at the moment so `Caliburn.Micro' is unable to locate the correct method.

You'd want to use something like:

// You wouldn't want to use a hard coded string, but this is how you'd do it.
caliburn:Message.Attach="FeedMonkey('banana')" 

// Or you can pass some of the special values linked in Rob's answer (the Caliburn docs).
// You'd probably want a sub property, depending on what it was you were passing. 
caliburn:Message.Attach="FeedMonkey($dataContext)"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top