无法触发InvokeCommandAction

时间:2018-07-14 13:09:24

标签: wpf mvvm prism

在单击文本块时,我想在视图模型中提升其内容,如果准确,请导航至另一页面。对我来说不幸的是,单击事件从未触发其绑定命令。下面是我的代码

在xaml中,我有这个标记

<UserControl x:Class="SchoolPrism.Login.Views.Login"

             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

             xmlns:local="clr-namespace:SchoolPrism.Login.Views"

             xmlns:prism="http://prismlibrary.com/"

             xmlns:constants="clr-namespace:Infrastructure.Constants;assembly=SchoolPrismInfrastructure"

             xmlns:login="clr-namespace:SchoolPrism.Login.ViewModel"

             mc:Ignorable="d" 

             d:DesignHeight="300" d:DesignWidth="300">

    <!-- when we have a view model, bind to that instead-->
    <Grid DataContext="{Binding login:LoginViewModel}">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="5*"/>
        </Grid.RowDefinitions>

        <TextBlock DataContext="{Binding}" Text="{Binding FormResults}"></TextBlock>

        <TextBlock Text="hi, can you see me?" x:Name="SchoolCode" Grid.RowSpan="2" Margin="0,50,0,0">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="PreviewMouseDown">

<!--tried replacing interactivity with prism here but it had no effect -->
<i:InvokeCommandAction Command="{Binding submitForm}" CommandParameter="{Binding Text, ElementName=SchoolCode}" ></i:InvokeCommandAction>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBlock>
    </Grid>
</UserControl> 

然后,在视图模型中,我有这个

using Prism.Commands;
using Prism.Modularity;
using SchoolPrism.Modules.Login;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace SchoolPrism.Login.ViewModel
{
    class LoginViewModel
    {

        ICommand submitForm
        {
            get { return new DelegateCommand<string>(SubmitForm); }
        }

        public void SubmitForm(string code)
        {

            // interact with model over given code

            // if auth, get module instance and invoke the following
            new LoginModule().proceedToNext("AllTopics");

        }
    }
}

最后,在适当的模块中,我有

using Microsoft.Practices.ServiceLocation;
using Microsoft.Practices.Unity;
using Prism.Commands;
using Prism.Modularity;
using Prism.Mvvm;
using Prism.Regions;
using SchoolPrism.Login.Views;
using System;
using System.Windows;
using System.Windows.Input;

namespace SchoolPrism.Modules.Login
{
    [Module(ModuleName = "LoginModule")]
    class LoginModule : BindableBase, IModule
    {

        IRegionManager _regionMan;

        // this method is called on our behalf by prism
        public void Initialize ()
        {

            _regionMan = ServiceLocator.Current.GetInstance<iregionmanager>();

        }

        public void proceedToNext (string target)
        {

            _regionMan.RequestNavigate("LoginForm", new Uri(target, UriKind.Relative)/*, (NavigationResult result) => { return code.Length > 0; }*/);
        }
        }
 } 

1 个答案:

答案 0 :(得分:0)

故障来自此行

<Grid DataContext="{Binding login:LoginViewModel}">

这对于绑定到属性而不是上下文本身是可以接受的。不幸的是,编译器没有抱怨。绑定到上下文的合适语法是

<Control.DataContext>
  <namespace:ContextObj>
</Control.DataContext>

在这种情况下为:

<Grid.DataContext>
  <login:LoginViewModel></login:LoginViewModel>
</Grid.DataContext>