I am developing a Silverlight application and I am trying to adhere to the principles of MVVM, but I am having problems changing the image source based on the state of the property in the ViewModel. In every sense and purpose, you can think of the functionality that I implement as a play / pause button for an audio application. When in the "Play" mode, IsActive is true in the ViewModel, and the "Pause.png" image on the button should be displayed. When paused, IsActive is false in the ViewModel, and "Play.png" is displayed on the button. Naturally, there are two additional images for processing when the mouse hangs over the button.
I thought I could use Style Trigger , but apparently they are not supported in Silverlight. I was looking at a forum post with a question similar to mine, where he suggested using VisualStateManager . Although this may help in changing the image for freezes / normal states, the missing part (or I donβt understand) is how it will work with the state of the state through the view model. The message seems to apply only to events, not to the properties of the view model. Having said that, I was also unable to successfully complete normal / freezing attacks.
Below is my Silverlight 4 XAML. It should also be noted that I work with MVVM Light.
<UserControl x:Class="Foo.Bar.MyUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" mc:Ignorable="d" d:DesignHeight="100" d:DesignWidth="200"> <UserControl.Resources> <Style x:Key="MyButtonStyle" TargetType="Button"> <Setter Property="IsEnabled" Value="true"/> <Setter Property="IsTabStop" Value="true"/> <Setter Property="Background" Value="#FFA9A9A9"/> <Setter Property="Foreground" Value="#FF000000"/> <Setter Property="MinWidth" Value="5"/> <Setter Property="MinHeight" Value="5"/> <Setter Property="Margin" Value="0"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Top" /> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="Cursor" Value="Hand"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Grid> <Image Source="/Foo.Bar;component/Resources/Icons/Bar/Play.png"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="Active"> <VisualState x:Name="MouseOver"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Source" Storyboard.TargetName="/Foo.Bar;component/Resources/Icons/Bar/Play_Hover.png" /> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> </Image> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background="White"> <Button Style="{StaticResource MyButtonStyle}" Command="{Binding ChangeStatus}" Height="30" Width="30" /> </Grid> </UserControl>
What is the correct way to update images on buttons with a state determined by the view model?
senfo source share