C# 从ViewModel对视图调用事件或方法
我正在尝试使用Transitionals库创建幻灯片放映,但使用TransitionNext方法时遇到问题。这是我的SelectorControl.xaml上的内容C# 从ViewModel对视图调用事件或方法,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在尝试使用Transitionals库创建幻灯片放映,但使用TransitionNext方法时遇到问题。这是我的SelectorControl.xaml上的内容 <Grid DockPanel.Dock="Top" Height="400" Width="600"> <controls:Slideshow x:Name="MainSlideshow"> <controls:SlideshowItem Backgro
<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();
}
如您所见,该按钮既有单击事件,也有ViewModel响应的命令。我的问题是,当我在ViewModel上时,如何简单地调用TransitionNext
我一直在玩弄交互/触发器,但它似乎更倾向于另一种方式。。。我有点困了。下面的代码允许我在调用TransisitionNext时回调ViewModel,但反过来不行
<interact:Interaction.Triggers>
<interact:EventTrigger EventName="TransitionNext">
<ei:CallMethodAction MethodName="ViewModelMethod"></ei:CallMethodAction>
</interact:EventTrigger>
</interact:Interaction.Triggers>
所以这一切都是可行的——我只希望能够从ViewModel调用TransitionNext,而不必在视图中执行。有人能帮忙吗?因为主幻灯片对象是视图对象,所以不能直接从viewmodel调用其方法。请记住,在MVVM模式中,viewmodel不能直接引用其视图。因此,必须从视图中调用Slideshow.TransitionNext方法
例如,可以使用“来自混合采样”的表达式来执行此操作
<controls:Slideshow x:Name="MainSlideshow">
<i:Interaction.Triggers>
<samples:DataEventTrigger EventName="ViewModelEvent">
<local:TransitionNextAction/>
</samples:DataEventTrigger>
</i:Interaction.Triggers>
</controls:Slideshow>
我从来没有面对这个问题,因为我的命令通常在我的ViewModel内部调用一个方法,可能会考虑这一溃败?事情是,我需要调用一个方法,我正在与Slideshow.TransitionNext一起工作,我不知道如何在VIEW模型中做到这一点。所以Slideshow.TransitionNext基本上是一个视图相关的方法?
class TransitionNextAction: TriggerAction<Slideshow>
{
protected override void Invoke(object o)
{
this.AssociatedObject.TransitionNext();
}
}