2013-11-09 85 views
1

我的应用程序(MVVM Light)调整它的主窗口(隐藏并用动画显示它)。对于动画我使用StaticResources带参数的DataTrigger:如何将StaticResources传递给MVVM中的ViewModel?

<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> 

在我的ViewModel我需要我的窗口的宽度值,所以我约束它。问题是它默认为0,所以我必须用一个值来初始化它。其实什么需要是我的静态资源的价值:WindowMaxWidth

  1. 我不能WindowMaxWidth的价值转移到视图模型,因为DataTriggr不接受绑定(它抱怨线程)
  2. 我不想在StaticResources和视图模型分别保持相同的值,以避免不连贯。

我该怎么办?

回答

2

WindowMaxWidthWindowMinWidth在你的视图模型,并与x:Static引用它们:

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

导入正确的名称空间xmlns:myns="clr-namespace:MyNamespace"

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

您可以落后于这样的方式在构造函数中使用的代码(例如,在将DataContext设置为ViewModel后):

(this.DataContext as MyViewModel).MyWindowWidth = (double)this.FindResource("WindowMaxWidth"); 
相关问题