简体   繁体   English

绑定VisualStateManager VisualState以查看模型吗?

[英]Bind VisualStateManager VisualState to view model?

I have Grid with three different VisualState's. 我有三个不同的VisualState的网格。 How would I bind this info to my view model as I need to do thing differently depending on view state. 我将如何将此信息绑定到视图模型,因为根据视图状态需要做不同的事情。

Right now Im using CurrentStateChanged event (which is not very mvvm way) but the major issue is that the event is not fired when the app is opened, so I do not know the initial visual state. 现在我正在使用CurrentStateChanged事件(不是很mvvm的方式),但是主要问题是在打开应用程序时不会触发该事件,因此我不知道初始的视觉状态。

My current view: 我目前的看法:

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

View model: 查看模型:

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

The only way I found how to do this is by also using code behind. 我找到方法的唯一方法是使用后面的代码。 In other words not found a real MVVM way either. 换句话说,也没有找到真正的MVVM方法。 But due to the fact I'm using x:Bind, I already have a property to the viewmodel in code behind too... so using that is easy. 但是由于我使用x:Bind的事实,我也已经在后面的代码中为viewmodel提供了一个属性...因此使用起来很容易。

To get it working correctly you'll need to use following code, note that I link the CurrentStateChanged of the VisualStateManager to the OnCurrentStateChanged method in code behind too. 为了使其正常工作,您需要使用以下代码,请注意,我也在后面的代码中将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);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM