在使用MVVM的UWP应用程序中,我试图将VisualStateGroup的当前状态绑定到ViewModel中的一个属性。其思想是通过根据应用程序逻辑更改视图模型中的属性值来更改当前状态。
这个问题几年前就已经在这个问题中解决了。我对Olav (第二个答案)建议的方法很感兴趣,它不能被直接遵循,因为我的应用程序是一个UWP应用程序。
我的xaml来了:
<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
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,而进一步的赋值不会产生任何影响。它可以是DataTriggerBehavior或GoToStateAction的使用。
怎么啦?非常感谢!
编辑:我向xaml添加了更多的代码,以更好地澄清这个问题。
发布于 2018-01-17 05:03:08
但是,对于此代码,在执行构造函数之后,当前状态仍然为空,并且进一步的赋值没有任何效果。它可以是DataTriggerBehavior或GoToStateAction的使用。
因为我没有看到您的整个代码,所以我不确定您的其他代码块中是否存在一些问题。但是,如果检查上面的代码,则需要进行一些更改。您需要将Interactivity:Interaction.Behaviors移出VisualStateGroup,如下所示:
<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”进行了分隔。
public MainPage()
{
this.InitializeComponent();
this.DataContext = new MainViewModel();
}然后,根据我的测试,我发现在绑定值更改之前不会触发'DataTriggerBehavior‘。我不知道这是否是默认行为,在GitHub上也有同样的问题。
因此,您可以在页面的加载事件中更改'VsmConnectionStatus‘值,而不是在viewmodel的构造函数方法中这样做。
例如,
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";
}public class MainViewModel : ViewModelBase
{
private string vsmConnectionStatus = "";
public string VsmConnectionStatus
{
get => vsmConnectionStatus;
set
{
vsmConnectionStatus = value;
RaisePropertyChanged("VsmConnectionStatus");
}
}
public MainViewModel()
{}
}https://stackoverflow.com/questions/48289988
复制相似问题