首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将VisualStateGroup的当前状态绑定到UWP MVVM应用程序中视图模型中的属性

将VisualStateGroup的当前状态绑定到UWP MVVM应用程序中视图模型中的属性
EN

Stack Overflow用户
提问于 2018-01-16 21:17:45
回答 1查看 1.1K关注 0票数 1

在使用MVVM的UWP应用程序中,我试图将VisualStateGroup的当前状态绑定到ViewModel中的一个属性。其思想是通过根据应用程序逻辑更改视图模型中的属性值来更改当前状态。

这个问题几年前就已经在这个问题中解决了。我对Olav (第二个答案)建议的方法很感兴趣,它不能被直接遵循,因为我的应用程序是一个UWP应用程序。

我的xaml来了:

代码语言:javascript
复制
<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
    xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
    x:Class="Smallrobots.Ev3RemoteController.Views.Settings"
    mc:Ignorable="d"

    DataContext="{Binding MainViewModel, Source={StaticResource Locator}}">

    <Grid>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="ConnectionStatus">
                <Interactivity:Interaction.Behaviors>
                    <Core:DataTriggerBehavior Binding="{Binding VsmConnectionStatus}" 
                                              Value="{Binding VsmConnectionStatus}">
                        <Core:GoToStateAction StateName="{Binding VsmConnectionStatus}"/>
                    </Core:DataTriggerBehavior>
                </Interactivity:Interaction.Behaviors>
                <VisualState x:Name="Connected">
                    <VisualState.Setters>
                        <Setter Target="button.(Control.IsEnabled)" Value="False"/>
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>

        <Button x:Name="button" Content="Connect"/>
    </Grid>
</Page>

MainViewModel

代码语言:javascript
复制
public class MainViewModel : ViewModelBase
{
    private string vsmConnectionStatus = "";
    public string VsmConnectionStatus
    {
        get => vsmConnectionStatus;
        set
        {
            if (!vsmConnectionStatus.Equals(value))
            {
                vsmConnectionStatus = value;
                RaisePropertyChanged("VsmConnectionStatus");
            }
        }
    }

    public MainViewModel()
    {
        VsmConnectionStatus = "Connected";
    }
}

但是,使用此代码后,在执行构造函数之后,当前状态将保持为null,而进一步的赋值不会产生任何影响。它可以是DataTriggerBehaviorGoToStateAction的使用。

怎么啦?非常感谢!

编辑:我向xaml添加了更多的代码,以更好地澄清这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-17 05:03:08

但是,对于此代码,在执行构造函数之后,当前状态仍然为空,并且进一步的赋值没有任何效果。它可以是DataTriggerBehavior或GoToStateAction的使用。

因为我没有看到您的整个代码,所以我不确定您的其他代码块中是否存在一些问题。但是,如果检查上面的代码,则需要进行一些更改。您需要将Interactivity:Interaction.Behaviors移出VisualStateGroup,如下所示:

代码语言:javascript
复制
<Grid>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="ConnectionStatus">
            <VisualState x:Name="Connected">
                <VisualState.Setters>
                    <Setter Target="button.(Control.IsEnabled)" Value="False"/>
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="NotConnected">
                <VisualState.Setters>
                    <Setter Target="button.(Control.IsEnabled)" Value="True"/>
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Interactivity:Interaction.Behaviors>
        <Core:DataTriggerBehavior Binding="{Binding VsmConnectionStatus}" 
                                      Value="{Binding VsmConnectionStatus}">
            <Core:GoToStateAction StateName="{Binding VsmConnectionStatus}"/>
        </Core:DataTriggerBehavior>
    </Interactivity:Interaction.Behaviors>
    <Button Content="{Binding VsmConnectionStatus}" x:Name="button">
    </Button>
</Grid>

第二,如果您想使用Binding,请确保您已对页面类的“DataContext”进行了分隔。

代码语言:javascript
复制
public MainPage()
{
    this.InitializeComponent();
    this.DataContext = new MainViewModel();
}

然后,根据我的测试,我发现在绑定值更改之前不会触发'DataTriggerBehavior‘。我不知道这是否是默认行为,在GitHub上也有同样的问题。

因此,您可以在页面的加载事件中更改'VsmConnectionStatus‘值,而不是在viewmodel的构造函数方法中这样做。

例如,

代码语言:javascript
复制
public MainPage()
{
    this.InitializeComponent();
    this.DataContext = new MainViewModel();
    this.Loaded += MainPage_Loaded;
}

private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    MainViewModel mvm = this.DataContext as MainViewModel;
    mvm.VsmConnectionStatus = "Connected";
}
代码语言:javascript
复制
public class MainViewModel : ViewModelBase
{
    private string vsmConnectionStatus = "";
    public string VsmConnectionStatus
    {
        get => vsmConnectionStatus;
        set
        {
            vsmConnectionStatus = value;
            RaisePropertyChanged("VsmConnectionStatus");
        }
    }

    public MainViewModel()
    {}
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48289988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档