我试图使用Transitionals库来创建幻灯片放映,但是我在使用TransitionNext()方法时遇到了问题。这就是我在SelectorControl.xaml上的内容。
<Grid DockPanel.Dock="Top" Height="400" Width="600">
<controls:Slideshow x:Name="MainSlideshow">
<controls:SlideshowItem Background="Blue">
<jamesTest:PlayerDisplay DataContext="{Binding CurrentPlayer}" />
</controls:SlideshowItem>
<controls:SlideshowItem >
<jamesTest:PlayerDisplay DataContext="{Binding SelectedPlayer}" />
</controls:SlideshowItem>
</Grid>
<Button DockPanel.Dock="Bottom" Name="StartStopButton" Content="Stop!" Background="Black" Click="ButtonBase_OnClick"
Command="{Binding StartButtonCommand}"
Visibility="{Binding BeginSlideShow, Converter={StaticResource visibilityConverter}}"/>
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
MainSlideshow.TransitionNext();
}
正如您所看到的,Button具有Click事件和ViewModel响应的命令。我的问题是,我如何简单地调用&#34; TransitionNext()&#34;虽然我在ViewModel上?
我一直在玩互动/触发器,但它看起来更像是另一种方式......我有点卡住了。下面的代码让我回想起ViewModel&#34; TranisitionNext&#34;被称为,但不是相反。
<interact:Interaction.Triggers>
<interact:EventTrigger EventName="TransitionNext">
<ei:CallMethodAction MethodName="ViewModelMethod"></ei:CallMethodAction>
</interact:EventTrigger>
</interact:Interaction.Triggers>
所以一切正常 - 我只是希望能够从ViewModel中调用TransitionNext,而不必在View中进行。有人可以帮忙吗?
答案 0 :(得分:0)
由于您的MainSlideshow
对象是视图对象,因此无法直接从viewmodel调用其方法。请记住,在MVVM模式中,视图模型不能对其视图有任何直接引用。因此,您必须从您的视图中调用Slideshow.TransitionNext()
方法。
您可以执行此操作,例如,使用Expression Blend Samples中的DataEventTrigger。
<controls:Slideshow x:Name="MainSlideshow">
<i:Interaction.Triggers>
<samples:DataEventTrigger EventName="ViewModelEvent">
<local:TransitionNextAction/>
</samples:DataEventTrigger>
</i:Interaction.Triggers>
</controls:Slideshow>
在这种情况下, TransitionNextAction
是您的自定义操作:
class TransitionNextAction: TriggerAction<Slideshow>
{
protected override void Invoke(object o)
{
this.AssociatedObject.TransitionNext();
}
}