【发布时间】:2016-09-12 16:00:54
【问题描述】:
我正在编写一个使用 Visual States 的 UWP 应用,但在将 IsActive 绑定到 StateTrigger 时遇到问题。
我们正在使用 MVVM,我需要能够更改 VisualState 的状态。
我现在的例子:
XAML
<Page
...
>
<Page.Resources>
<local:InvBoolConverter x:Key="InvBoolConverter" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" x:Name="MainGrid">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="textSwitcher">
<VisualState>
<VisualState.StateTriggers>
<StateTrigger IsActive="{Binding IsRedTrigger, Converter={StaticResource InvBoolConverter}}" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="txtBlock.Foreground" Value="Blue" />
</VisualState.Setters>
</VisualState>
<VisualState>
<VisualState.StateTriggers>
<StateTrigger IsActive="{Binding IsRedTrigger}" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="txtBlock.Foreground" Value="Red" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<StackPanel Orientation="Vertical">
<Button Content="Switch" Command="SwitchClickCommand" />
</StackPanel>
<TextBlock x:Name="txtBlock" Margin="100" Foreground="Blue">My Text</TextBlock>
</Grid>
</Page>
查看模型
namespace ...
{
public class MainPageViewModel : BindableBase
{
public MainPageViewModel()
{
SwitchClickCommand = new DelegateCommand(_SwitchButtonClicked);
}
public readonly ICommand SwitchClickCommand;
bool _IsRedTrigger;
public bool IsRedTrigger
{
get { return _IsRedTrigger; }
set
{
_IsRedTrigger = value;
OnPropertyChanged();
}
}
void SwitchButtonClicked()
{
IsRedTrigger = !IsRedTrigger;
}
}
}
除了 VisualState 实际上没有改变之外,一切似乎都正常工作。
我是否正确使用StateTrigger?
谢谢!
【问题讨论】:
-
你能把你的
BindableBase的代码贴出来吗?由IsRedTrigger触发,你在这个BindableBase中完成了INotiftpropertyChanged的工作了吗? -
我正在使用 Prism 的
BindableBase,发现:https://github.com/PrismLibrary/Prism/blob/master/Source/Prism/Mvvm/BindableBase.cs。所以是的,它使用INotifyPropertyChanged正确完成,并且被正确触发。
标签: c# xaml win-universal-app