Andrzej Gis
Andrzej Gis

Reputation: 14306

How to pass StaticResources to a ViewModel in MVVM?

My application (MVVM Light) resizes it's main window (hides and shows it with an animation). For the animation I use a DataTrigger with parameters from StaticResources:

<Window.Resources>
    <system:Double x:Key="WindowMaxWidth">400</system:Double>
    <system:Double x:Key="WindowMinWidth">25</system:Double>
</Window.Resources>
<Window.Style>
    <Style TargetType="Window">
        <Style.Triggers>
            <DataTrigger Binding="{Binding DropBox.IsShown}" Value="True">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width"
                                             To="{StaticResource WindowMaxWidth}"
                                             Duration="0:0:0:0.2"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width"
                                             To="{StaticResource WindowMinWidth}"
                                             Duration="0:0:0:0.2"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Style>

In my ViewModel I need my window's width value, so I bound it. The problem is that it's 0 by default, so I have to initialize it with a value. Actually what need is the value form my static resources: WindowMaxWidth.

  1. I can't move the value of WindowMaxWidth to ViewModel because DataTriggr doesn't accept bindings (it complains about threads)
  2. I don't want to keep the same value separately in StaticResources and ViewModel to avoid incoherence.

What should I do?

Upvotes: 1

Views: 1177

Answers (2)

Alberto
Alberto

Reputation: 15941

Put WindowMaxWidth and WindowMinWidth in your viewmodel and reference them with x:Static:

namespace MyNamespace
{
   class ViewModel
   {
      public static double WindowMaxWidth = 400;
      public static double WindowMinWidth = 25;
   }
}

Import the right namespace xmlns:myns="clr-namespace:MyNamespace"

<DoubleAnimation Storyboard.TargetProperty="Width"
    To="{x:Static myns:ViewModel.WindowMaxWidth}"
    Duration="0:0:0:0.2"/>

Upvotes: 2

fex
fex

Reputation: 3558

You can use code behind in such way (for instance in constructor, after you set DataContext to ViewModel):

(this.DataContext as MyViewModel).MyWindowWidth = (double)this.FindResource("WindowMaxWidth");

Upvotes: 0

Related Questions