繁体   English   中英

绑定VisualStateManager VisualState以查看模型吗?

[英]Bind VisualStateManager VisualState to view model?

我有三个不同的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;
    }
    ...
}

我找到方法的唯一方法是使用后面的代码。 换句话说,也没有找到真正的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);
    }
}

暂无
暂无

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

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