nmeri17 Ответов: 2

Почему моя invokecommandaction не может выстрелить?


Привет. При щелчке по текстовому блоку я хочу поднять его содержимое в своей модели представления и, если это точно, перейти на другую страницу. К сожалению, для меня, событие click не срабатывает, связанных команд. Ниже приведен мой код

Что я уже пробовал:

В 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; }*/);
        }
        }
 }

Пожалуйста, что я делаю не так?

George Swan

Попробуйте определить свое командное свойство следующим образом:
public DelegateCommand<string> SubmitFormCommand { get; private set; }
Затем создайте его экземпляр в конструкторе viewmodel.
SubmitFormCommand = new DelegateCommand<string>(SubmitForm);

nmeri17

Это не было лекарством.

2 Ответов

Рейтинг:
18

nmeri17

С помощью

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


Решить ее


Рейтинг:
0

George Swan

Попробуйте установить DataContext подобный этому


<UserControl.Resources>
        <login:LoginViewModel x:Key="loginvm" />
    </UserControl.Resources>
    <UserControl.DataContext>
        <Binding Source="{StaticResource loginvm}" />
</UserControl.DataContext>


nmeri17

Это также еще один способ сделать это. Однако я обычно предпочитаю определять все свои ресурсы в одном файле специально для широкого применения специальных возможностей. Этот метод пригодится, если предположить, что я намерен использовать один и тот же контекст данных для нескольких элементов управления. Тем не менее, спасибо, что заглянули