从ViewModel调用视图上的事件或方法

时间:2015-02-25 15:22:30

标签: c# wpf mvvm

我试图使用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中进行。有人可以帮忙吗?

1 个答案:

答案 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();
    }
}