Caliburn Micro Win8.1 App - 方法X没有找到目标

时间:2014-02-01 10:51:23

标签: xaml mvvm winrt-xaml windows-8.1 caliburn.micro

我是一名xaml新手,对WPF / Store应用程序来说还不错。我试图为Windows 8.1 Store应用程序创建一个Caliburn Micro(在最近的代码上编译)的简单示例。但我无法让它运行,因为从昨天起我收到错误 - No target found for method X我在我下载的源代码下尝试了样本,它们工作正常。同样我试图从头开始创建,它抛出上述异常。 以下是整个解决方案的代码,如果我配置/使用错误,请纠正我!

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 \助手\ 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 \模型\ 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 \视图\ 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 \视图\ 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();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

你的vm中的feedmonkey方法需要一个字符串参数,但是当你连接到你的按钮时你不提供它。有关详细信息,请参阅此处:http://caliburnmicro.codeplex.com/wikipage?title=Cheat%20Sheet

答案 1 :(得分:0)

Rob是正确的,您需要匹配FeedMonkey(string monkeyFood)的方法签名,此时“Caliburn.Micro”无法找到正确的方法。

你想要使用类似的东西:

// 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)"
相关问题