Почему моя 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
Это не было лекарством.