VisualStateManager の仕組みを理解しようとしていますが、できません。
私はこれをしたい: ユーザーが自分の名前、住所などを入力できる TextBoxes がいくつかあり、検証を行っていますが、XAML の validationrules-binding でそれを行いたくありませんでした。私はMVVMパターンを使用していますが、ビューモデルのいくつかのコードがそれを行います。したがって、テキストボックスのテキストを、ビューモデルが検証した文字列にバインドしています。そこには、それが正しいかどうかを示すブール変数があります。
私のXAML:
<UserControl
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:Custom="http://schemas.microsoft.com/surface/2008"
mc:Ignorable="d"
x:Class="Surface_Bachelorarbeit.NeuerUser"
x:Name="UserControl"
UseLayoutRounding="True"
d:DesignWidth="640" d:DesignHeight="480" Width="800" Height="350">
<Border x:Name="Border1" BorderBrush="Black" BorderThickness="5" CornerRadius="5" DataContext="{Binding Source={StaticResource MainViewModelDataSource}}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisibilityStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0" To="NameValid">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="VN_valid">
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="VN_invalid">
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>
<VisualTransition GeneratedDuration="0" To="NameInvalid">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="VN_invalid">
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="VN_valid">
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="NameValid"/>
<VisualState x:Name="NameInvalid"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
...
<Custom:SurfaceTextBox x:Name="vname" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Margin="0,1,22,8" FontSize="14.667" SelectionBrush="{x:Null}" BorderBrush="{x:Null}" Foreground="Black" DataContext="{Binding Forename}" Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" LostFocus="vname_LostFocus"/>
...
<Image x:Name="VN_valid" HorizontalAlignment="Left" Margin="0,1,0,0" Width="22" Source="valid.png" Height="22" VerticalAlignment="Top" d:LayoutOverrides="Height"/>
<Image x:Name="VN_invalid" HorizontalAlignment="Left" Margin="0,1,0,0" Width="22" Height="22" Source="invalid.png" VerticalAlignment="Top" d:LayoutOverrides="Height"/>
...
ユーザーのフォーカスがテキストボックスから離れると、次のイベントが発生します。
private void vname_LostFocus(object sender, System.Windows.RoutedEventArgs e)
{
mvm = ((MainViewModel)FindResource("MainViewModelDataSource"));
if (mvm.NewCreatedStoreUser.Forename.Valid)
{
VisualStateManager.GoToState(this, "NameValid", true);
}
else
{
VisualStateManager.GoToState(this, "NameInvalid", true);
}
}
イベントが発生し、正しい GoToState-Method に移動しますが、試してみましたが、状態は変更されません。何も起こりません。
ExtendedVisualStateManager.GoToElementState(this.Border1 as FrameworkElement, "NameValid", false);も試しました。
私はここでそれが役立つと読んだので、それはそれとまったく同じです...
私は何を間違えましたか??