我有以下非常简单的复制案例。它是通用Windows(电话)8.1应用程序。我有一个非常简单的模型:
HttpClient
以及这些模型的集合,定义为共享类:
public class SimpleModel
{
public bool IsLoading { get; set; } = false;
}
我在Windows和Windows Phone 8.1项目中只有一个页面。它们具有相同的XAML,简单的ItemsControl:
public class SimpleModelCollection : List<SimpleModel>
{
public SimpleModelCollection()
{
this.Add(new SimpleModel());
this.Add(new SimpleModel());
this.Add(new SimpleModel());
this.Add(new SimpleModel());
this.Add(new SimpleModel());
this.Add(new SimpleModel());
}
}
当然,行为SDK被添加到(Win和WP 8.1)项目中。
在代码隐藏中,我将ItemsSource设置为前面提到的简单模型集合的实例。 Windows Phone构造函数:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ItemsControl x:Name="items" HorizontalAlignment="Center">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<interactivity:Interaction.Behaviors>
<core:DataTriggerBehavior Binding="{Binding IsLoading}" Value="True">
<core:ChangePropertyAction TargetObject="{Binding ElementName=text}" PropertyName="Visibility" Value="Visible"/>
</core:DataTriggerBehavior>
<core:DataTriggerBehavior Binding="{Binding IsLoading}" Value="False">
<core:ChangePropertyAction TargetObject="{Binding ElementName=text}" PropertyName="Visibility" Value="Collapsed"/>
</core:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
<StackPanel>
<TextBlock x:Name="text" Text="Should I be visible?" FontSize="26"></TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
和Windows构造函数:
public MainPage()
{
this.InitializeComponent();
this.items.ItemsSource = new SimpleModelCollection();
this.NavigationCacheMode = NavigationCacheMode.Required;
}
如果将IsLoading初始化为false,您会期望什么?
public MainPage()
{
this.InitializeComponent();
this.items.ItemsSource = new SimpleModelCollection();
}
让我向您展示如果在Windows Phone上将Isloading初始化为false,应用程序的样子:
这是可以的,并且完全可以预期,因为可见性映射到bool值,因此如果IsLoading为false,则应折叠TextBlocks。但在Windows上,它们不是:
我的问题是 - 为什么?我错过了什么?
将WP 8.1行为与Windows 10 UWP中的行为进行比较时,这也存在问题。在UWP中,它的行为就像在Windows 8.1上一样,这使得从WP 8.1移植到UWP有点痛苦。
编辑:完整的repro项目在这里:https://github.com/igrali/BehaviorsSDK_Bug
答案 0 :(得分:3)
这确实是一个错误。我可以看到两种解决方法。
首先,如果您完全知道TextBlock
的初始状态应为Collapsed
,则可以将其默认为XAML中的Collapsed
,因为它不起作用这是第一次。
或者,您可以将所有Behavior
直接附加到模板内的Textblock
。这也应该有用。
<DataTemplate>
<Grid>
<StackPanel>
<TextBlock x:Name="text" Text="Should I be visible?" FontSize="26">
<interactivity:Interaction.Behaviors>
<core:DataTriggerBehavior Binding="{Binding IsLoading}" Value="True">
<core:ChangePropertyAction TargetObject="{Binding ElementName=text}" PropertyName="Visibility" Value="Visible" />
</core:DataTriggerBehavior>
<core:DataTriggerBehavior Binding="{Binding IsLoading}" Value="False">
<core:ChangePropertyAction TargetObject="{Binding ElementName=text}" PropertyName="Visibility" Value="Collapsed" />
</core:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
</TextBlock>
<Button Click="Button_Click" Content="Visible?" />
</StackPanel>
</Grid>
</DataTemplate>