2016-01-25 116 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時不知道。所以這似乎是唯一的(足夠乾淨的)選項,至少現在是這樣。 –