При щелчке текстового блока я хочу поднять его содержимое в моей модели представления и, если это верно, перейти на другую страницу. К сожалению для меня, событие щелчка никогда не запускает связанную команду. Ниже мой код
В 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; }*/);
}
}
}
@ASh Я сделал это, но событие все еще не сработало :(





Ошибка из этой строки
<Grid DataContext = "{Binding login:LoginViewModel}">
Это приемлемо для привязки к свойствам, а не к самим контекстам. К сожалению, компилятор не жалуется. Подходящий синтаксис для привязки к контексту:
<Control.DataContext>
<namespace:ContextObj>
</Control.DataContext>
который в этом случае будет:
<Grid.DataContext>
<login:LoginViewModel></login:LoginViewModel>
</Grid.DataContext>
сделать
ICommand submitFormобщедоступным:public ICommand submitForm { ... }