Click here to Skip to main content
15,891,657 members
Articles / Desktop Programming / WPF

Executing Command Logic in a View Model

Rate me:
Please Sign up or sign in to vote.
4.94/5 (54 votes)
9 Mar 2011CPOL14 min read 304.9K   2.8K   142  
Introduces the RoutedCommandBinding class as a new way for invoking methods in a View Model directly from XAML in an MVVM application.
<Window
  x:Class="RoutedCommandBindingSample.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="Simple Media Player" Height="350" Width="525"
  Icon="pack://application:,,,/Resources/Sound.ico"
  xmlns:local="clr-namespace:RoutedCommandBindingSample"
  xmlns:cmd="clr-namespace:RoutedCommandBindingSample.Commands">

  <Window.Resources>
    <Style x:Key="MediaButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
      <Setter Property="Margin" Value="2"/>
      <Setter Property="Width" Value="35"/>
      <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
          <Setter Property="Opacity" Value=".5"/>
        </Trigger>
      </Style.Triggers>
    </Style>

    <Style x:Key="MediaToolbarButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource MediaButtonStyle}">
      <Setter Property="Margin" Value="0"/>
      <Setter Property="Width" Value="24"/>
    </Style>
  </Window.Resources>
  
  <Window.CommandBindings>
    <cmd:DataContextCommandBinding Command="MediaCommands.Play" Executed="Play" CanExecute="CanPlay" />
    <cmd:DataContextCommandBinding Command="MediaCommands.Stop" Executed="Stop" CanExecute="CanStop" />
    <cmd:DataContextCommandBinding Command="local:MyMediaCommands.Pause" Executed="Pause" CanExecute="CanPause" />
  </Window.CommandBindings>

  <DockPanel LastChildFill="True">

    <Menu DockPanel.Dock="Top">
      <MenuItem Header="Playback Menu">
        <MenuItem Header="Play" Command="MediaCommands.Play" />
        <MenuItem Header="Stop" Command="MediaCommands.Stop" />
        <MenuItem Header="Pause" Command="local:MyMediaCommands.Pause" />
      </MenuItem>
    </Menu>

    <ToolBar DockPanel.Dock="Top" Height="28">
      <Button Command="MediaCommands.Play" Style="{StaticResource MediaToolbarButtonStyle}">
        <Image Source="pack://application:,,,/Resources/Play.png"/>
      </Button>
      <Button Command="MediaCommands.Stop" Style="{StaticResource MediaToolbarButtonStyle}">
        <Image Source="pack://application:,,,/Resources/Stop.png"/>
      </Button>
      <Button Command="local:MyMediaCommands.Pause" Style="{StaticResource MediaToolbarButtonStyle}">
        <Image Source="pack://application:,,,/Resources/Pause.png"/>
      </Button>
    </ToolBar>

    <DockPanel DockPanel.Dock="Top" Margin="10" LastChildFill="True">
      <Label Content="Uri:" DockPanel.Dock="Left"/>
      <TextBox Text="{Binding SourceUri, UpdateSourceTrigger=PropertyChanged}" />
    </DockPanel>

    <DockPanel DockPanel.Dock="Top" Margin="10" LastChildFill="True">
      <Label Content="Volume:" DockPanel.Dock="Left"/>
      <Slider Value="{Binding Volume}" Minimum="0" Maximum="1" SmallChange=".01" LargeChange=".05" TickPlacement="BottomRight" TickFrequency=".05" />
    </DockPanel>

    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="10" Height="25">
      <Label Content="Via DataContextCommandBindings:" />
      <Button Command="MediaCommands.Play" Style="{StaticResource MediaButtonStyle}">
        <Image Source="pack://application:,,,/Resources/Play.png"/>
      </Button>
      <Button Command="MediaCommands.Stop" Style="{StaticResource MediaButtonStyle}">
        <Image Source="pack://application:,,,/Resources/Stop.png"/>
      </Button>
      <Button Command="local:MyMediaCommands.Pause" Style="{StaticResource MediaButtonStyle}">
        <Image Source="pack://application:,,,/Resources/Pause.png"/>
      </Button>
    </StackPanel>

    <StackPanel Orientation="Horizontal"  DockPanel.Dock="Top" Margin="10" Height="25">
      <Label Content="Via DataContextCommandAdapter:" />
      <Button Command="{cmd:DataContextCommandAdapter Play, CanPlay}" Style="{StaticResource MediaButtonStyle}">
        <Image Source="pack://application:,,,/Resources/Play.png"/>
      </Button>
      <Button Command="{cmd:DataContextCommandAdapter Stop, CanStop}" Style="{StaticResource MediaButtonStyle}">
        <Image Source="pack://application:,,,/Resources/Stop.png"/>
      </Button>
      <Button Command="{cmd:DataContextCommandAdapter Pause, CanPause}" Style="{StaticResource MediaButtonStyle}">
        <Image Source="pack://application:,,,/Resources/Pause.png"/>
      </Button>
    </StackPanel>

    <StackPanel Orientation="Horizontal"  DockPanel.Dock="Top" Margin="10" Height="25">
      <Label Content="Via DataContextCommandAdapter on InputBindings:" />
      <Button Style="{StaticResource MediaButtonStyle}">
        <Button.InputBindings>
          <MouseBinding Command="{cmd:DataContextCommandAdapter Play, CanPlay}" MouseAction="LeftClick"/>
        </Button.InputBindings>
        <Image Source="pack://application:,,,/Resources/Play.png"/>
      </Button>
      <Button Style="{StaticResource MediaButtonStyle}">
        <Button.InputBindings>
          <MouseBinding Command="{cmd:DataContextCommandAdapter Stop, CanStop}" MouseAction="LeftClick"/>
        </Button.InputBindings>
        <Image Source="pack://application:,,,/Resources/Stop.png"/>
      </Button>
      <Button Style="{StaticResource MediaButtonStyle}">
        <Button.InputBindings>
          <MouseBinding Command="{cmd:DataContextCommandAdapter Pause, CanPause}" MouseAction="LeftClick"/>
        </Button.InputBindings>
        <Image Source="pack://application:,,,/Resources/Pause.png"/>
      </Button>
    </StackPanel>

    <Label Content="Media Messages" DockPanel.Dock="Top" />
    <ListView ItemsSource="{Binding Messages}" />
  </DockPanel>
</Window>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Fidelity National Financial
United States United States
Doug Schott has been developing .NET applications for the past 8 years.

He is currently working as a senior software consultant at Fidelity National Financial.

Comments and Discussions