CallMethodAction 和 InvokeCommandAction
有些事件是没有直接提供命令调用的,如自定义的事件。这时候我们可以通过CallMethodAction来调用ViewModel中的方法来完成相应的操作。
一些不支持Command的控件,可以用一个CallMethodAction触发器来执行ViewModel中的方法。注意的是方法当中往往包含一些参数,这些参数一般可以通过给ViewModel设置相应的属性来绑定到相关的输入控件,如TextBox。
您可以使用 CallMethodAction 操作来调用为指定对象定义的方法。所调用的方法必须是不采用参数并且不返回值的公共方法,或是其签名与事件处理程序的签名相匹配的公共方法。”
<Button Content="TestCallMethodAction">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ec:CallMethodAction TargetObject="{Binding}" MethodName="CallThisMethod"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
public void CallThisMethod(){}
CallMethodAction内部用反射实现的,效率比起InvokeCommandAction要低不少。
另外Action是可以自定义的,要是感觉InvokeCommandAction不够用可以自己定义一个。
Notification通知式
Prism通过InteractionRequest 来实现弹窗交互,它是一个泛型接口,不同的类型对应不同类型的弹窗方式。
在使用InteractionRequest
的时候需要在,xaml中需要注册一个Trigger:
<i:Interaction.Triggers>
<prism:InteractionRequestTrigger SourceObject="{Binding NotificationRequest}">
<prism:PopupWindowAction IsModal="True" CenterOverAssociatedObject="True" />
</prism:InteractionRequestTrigger>
</i:Interaction.Triggers>
这里用到了Interaction
,他是i
命名空间里的东西,那么i
是什么呢?interactivity
这个是微软内置的类库,他提供了一组用户交互的类,比如我们这里用到的EventTrigger
可以用来执行事件触发的操作。
在使用的时候,先引入xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
或者xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
,然后在xaml中使用他:
<i:Interaction.Triggers>
<i:EventTrigger>
</i:EventTrigger>
</i:Interaction.Triggers>
而 prism:PopupWindowAction 的 IsModal=True意味着弹框不被关闭的时候,父窗体无法使用。我刚搜索了一下,这个词的翻译竟然“模态”。
模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。 如单击【确定】或【取消】按钮等将该对话框关闭。
好,接着,我们在code-behind中声明,使用INotification
类型:
public InteractionRequest<INotification> NotificationRequest { get; set; }
使用资源字典
要是用资源字典,首先要将资源字典集成到应用程序的某些资源集合中。一般的做法都是在app.xaml文件中进行集成。代码如下:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Test.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
DelegateCommand
<!-- 无参方式 -->
<Button Content="Test Command" Command="{Binding TestCommand}" />
<!-- 将自己作为参数 -->
<Button Content="Test Command2" Command="{Binding TestCommand2}" CommandParameter="{Binding RelativeSource={x:Static RelativeSource.Self}}" >
<!-- 将父元素作为参数 -->
<Button Content="Test Command3" Command="{Binding TestCommand3}" CommandParameter="{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}}" >
this.DataContext = new ViewModel();
// ViewModel 构造函数
public ViewModel()
{ CallCOmmand1 = new DelegateCOmmmand(Call1);
CallCOmmand2 = new DelegateCOmmmand<Object>(Call2);
CallCOmmand3 = new DelegateCOmmmand<Object>(Call3);
}
// 命令声明
public DelegateCommand CallCommand { get; private set; }
public DelegateCommand<Object> CallCommand2 { get; private set; }
public DelegateCommand<Object> CallCommand3 { get; private set; }
// 命令实现
public void Call1()
{
}
public void Call2( Object obj )
{
Button button = obj as Button;
}
public void Call3( Object obj )
{
ParentType parent = obj as ParentType;
}
private DelegateCommand Command;
public DelegateCommand Command
{
get
{
if (null == Command)
{
Command = new DelegateCommand(Search, CanExecute);
}
return Command;
}
}
private bool CanExecute()
{
return CanSearch;
}
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="84*"/>
<RowDefinition Height="116*"/>
<RowDefinition Height="116*"/>
<RowDefinition Height="70*"/>
<RowDefinition Height="70*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="4*"/>
</Grid.ColumnDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<Label Height="Auto" Width="108"/>
<ComboBox Grid.Column="1" Height="30" VerticalContentAlignment="Center">
</ComboBox>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<Label HorizontalAlignment="Stretch" VerticalContentAlignment="Top" HorizontalContentAlignment="Center" Height="Auto"/>
<TextBox Grid.Column="1" />
</Grid>
<TextBlock Background="WhiteSmoke" Grid.Row="2" FontSize="15" Margin="30,10,0,10" TextWrapping="Wrap" Text="{DynamicResource lblWarn}" Foreground="Red"/>
<Grid Grid.Row="3" Margin="20,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button />
<Button Grid.Column="1" Command="{Binding WriteCmd}" IsEnabled="{Binding CurrentModel.BtnEnable}"/>
<Button Grid.Column="2" Command="{Binding ReadCmd}" IsEnabled="{Binding CurrentModel.BtnEnable}"/>
</Grid>
<Grid Grid.Row="4" Margin="30,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button />
<Button Grid.Column="1"/>
</Grid>
<ScrollViewer Grid.Column="1" Grid.RowSpan="5">
<RichTextBox Grid.Column="1" Grid.RowSpan="5" Padding="5" IsReadOnly="True" ScrollViewer.VerticalScrollBarVisibility="Auto" Background="#FFB7DEE8">
</RichTextBox>
</ScrollViewer>
</Grid>
prism:RegionManager.RegionName="{x:Static inf:RegionNames.xxxxRegion}"