2016-01-25 158 views
1

我有三个不同的VisualState的网格。我如何将这个信息绑定到我的视图模型,因为我需要根据视图状态做不同的事情。绑定VisualStateManager VisualState以查看模型?

现在我使用CurrentStateChanged事件(这不是非常mvvm的方式),但主要问题是事件没有在应用程序打开时被触发,所以我不知道最初的可视状态。

我当前视图:

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="AdaptiveVisualStateGroup" CurrentStateChanged="{x:Bind ViewModel.ViewStateChanged, Mode=OneWay}"> 
     <VisualState x:Name="VisualStateNarrow"> 
      <VisualState.StateTriggers> 
       <AdaptiveTrigger MinWindowWidth="0" /> 
      </VisualState.StateTriggers> 
      <VisualState.Setters> 
      ... 
      </VisualState.Setters> 
     </VisualState> 
     <VisualState x:Name="VisualStateNormal"> 
      <VisualState.StateTriggers> 
       <AdaptiveTrigger MinWindowWidth="720" /> 
      </VisualState.StateTriggers> 
      <VisualState.Setters> 
      ... 
      </VisualState.Setters> 
     </VisualState> 
     <VisualState x:Name="VisualStateWide"> 
      <VisualState.StateTriggers> 
       <AdaptiveTrigger MinWindowWidth="1000" /> 
      </VisualState.StateTriggers> 
      <VisualState.Setters> 
      ... 
      </VisualState.Setters> 
     </VisualState> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

视图模型:

public void ViewStateChanged(object sender, VisualStateChangedEventArgs args) 
{ 
    if(args.NewState.Name == "VisualStateNarrow") 
    { 
     isNarrowState = true; 
    } 
    ... 
} 

回答

2

我发现怎么做,这是通过使用同样的代码背后的唯一途径。换句话说,没有找到真正的MVVM方式。 但是由于我使用x:Bind的事实,我已经在代码背后的viewmodel中拥有了一个属性......所以使用它很简单。

为了使它正常工作,您需要使用以下代码,请注意,我将VisualStateManager的CurrentStateChanged链接到代码中的OnCurrentStateChanged方法。

public sealed partial class MainPage : Page 
{ 
    private IViewModel ViewModel => DataContext as IViewModel; 

    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 
     UpdateVisualState(VisualStateGroup.CurrentState); 
    } 

    private void UpdateVisualState(VisualState currentState) 
    { 
     ViewModel.CurrentState = currentState; 
    } 

    private void OnCurrentStateChanged(object sender, VisualStateChangedEventArgs e) 
    { 
     UpdateVisualState(e.NewState); 
    } 
} 
+0

我试图编写一个行为来完成此操作,但不幸的是,初始状态在行为附加到VisualStateGroup时不知道。所以这似乎是唯一的(足够干净的)选项,至少现在是这样。 –