UWP PivotItem Header 可见性绑定
UWP PivotItem Header visibility binding
我在 UWP 中进行绑定,列表视图未显示(因此工作正常),但 header 仍在视图中。
所以问题是 header 没有从 PivotItem 获取绑定,可能是什么问题?
<PivotItem Header="Hello" Visibility="{Binding isVisible, Converter={StaticResource Visibility}}">
<ListView ItemsSource="{Binding myList}"/>
</PivotItem>
这其实有点棘手。在 PivotItem
上设置 Visibility
确实只隐藏项目的内容,而不是 PivotItem
本身。也就是说,您可以通过将其从枢轴中完全删除来从 code-behind 中隐藏它:
MyPivot.Items.Remove(HideablePivotItem);
现在的问题是您需要在绑定更改时触发它。为此,我建议您使用自定义 Behavior
和 CallMethodAction
.
首先从 NuGet 安装 Microsoft.Xaml.Behaviors.Uwp.Managed
(right-click 您的项目,单击 Manage NuGet Packages...
使用搜索找到包并单击 Install
。
现在,创建一个新的 class DataChangeTriggerBehavior
class:
public class DataChangeTriggerBehavior : Trigger<FrameworkElement>
{
public static readonly DependencyProperty BindingProperty = DependencyProperty.Register(
nameof(Binding), typeof(object), typeof(DataChangeTriggerBehavior), new PropertyMetadata(null, BindingChanged));
public object Binding
{
get => (object)GetValue(BindingProperty);
set => SetValue(BindingProperty, value);
}
private static void BindingChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
{
DataChangeTriggerBehavior changeTrigger = (DataChangeTriggerBehavior)dependencyObject;
if (changeTrigger.AssociatedObject == null) return;
Interaction.ExecuteActions(changeTrigger.AssociatedObject, changeTrigger.Actions, args);
}
}
此行为将观察绑定并在绑定发生更改时触发其关联的操作。
现在,按如下方式更新您的 Page
元素:
<Page
...
x:Name="Page"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
xmlns:customBehavior="using:XXX"
mc:Ignorable="d">
其中 XXX
是定义您的行为的命名空间。
现在使用 Pivot
中的行为:
<Pivot x:Name="MyPivot">
<interactivity:Interaction.Behaviors>
<local:DataChangeTriggerBehavior Binding="{Binding isVisible}">
<core:CallMethodAction MethodName="TogglePivotItem"
TargetObject="{Binding ElementName=Page}" />
</local:DataChangeTriggerBehavior>
</interactivity:Interaction.Behaviors>
<PivotItem Header="Hello" Visibility="Collapsed" x:Name="HideablePivotItem">
<ListView ItemsSource="{Binding myList}"/>
</PivotItem>
</Pivot>
最后,您必须在页面的 code-behind:
中定义 TogglePivotItem
方法
private int originalPosition = 0;
public void TogglePivotItem()
{
if (MyPivot.Items.Contains(HideablePivotItem))
{
//store the position of the item to be readded later
originalPosition = MyPivot.Items.IndexOf(HideablePivotItem);
MyPivot.Items.Remove(HideablePivotItem);
}
else
{
MyPivot.Items.Insert(originalPosition, HideablePivotItem);
}
}
我正在存储 PivotItem
的原始位置,以便它可以再次 re-added 到同一个地方。
我在 UWP 中进行绑定,列表视图未显示(因此工作正常),但 header 仍在视图中。
所以问题是 header 没有从 PivotItem 获取绑定,可能是什么问题?
<PivotItem Header="Hello" Visibility="{Binding isVisible, Converter={StaticResource Visibility}}">
<ListView ItemsSource="{Binding myList}"/>
</PivotItem>
这其实有点棘手。在 PivotItem
上设置 Visibility
确实只隐藏项目的内容,而不是 PivotItem
本身。也就是说,您可以通过将其从枢轴中完全删除来从 code-behind 中隐藏它:
MyPivot.Items.Remove(HideablePivotItem);
现在的问题是您需要在绑定更改时触发它。为此,我建议您使用自定义 Behavior
和 CallMethodAction
.
首先从 NuGet 安装 Microsoft.Xaml.Behaviors.Uwp.Managed
(right-click 您的项目,单击 Manage NuGet Packages...
使用搜索找到包并单击 Install
。
现在,创建一个新的 class DataChangeTriggerBehavior
class:
public class DataChangeTriggerBehavior : Trigger<FrameworkElement>
{
public static readonly DependencyProperty BindingProperty = DependencyProperty.Register(
nameof(Binding), typeof(object), typeof(DataChangeTriggerBehavior), new PropertyMetadata(null, BindingChanged));
public object Binding
{
get => (object)GetValue(BindingProperty);
set => SetValue(BindingProperty, value);
}
private static void BindingChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
{
DataChangeTriggerBehavior changeTrigger = (DataChangeTriggerBehavior)dependencyObject;
if (changeTrigger.AssociatedObject == null) return;
Interaction.ExecuteActions(changeTrigger.AssociatedObject, changeTrigger.Actions, args);
}
}
此行为将观察绑定并在绑定发生更改时触发其关联的操作。
现在,按如下方式更新您的 Page
元素:
<Page
...
x:Name="Page"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
xmlns:customBehavior="using:XXX"
mc:Ignorable="d">
其中 XXX
是定义您的行为的命名空间。
现在使用 Pivot
中的行为:
<Pivot x:Name="MyPivot">
<interactivity:Interaction.Behaviors>
<local:DataChangeTriggerBehavior Binding="{Binding isVisible}">
<core:CallMethodAction MethodName="TogglePivotItem"
TargetObject="{Binding ElementName=Page}" />
</local:DataChangeTriggerBehavior>
</interactivity:Interaction.Behaviors>
<PivotItem Header="Hello" Visibility="Collapsed" x:Name="HideablePivotItem">
<ListView ItemsSource="{Binding myList}"/>
</PivotItem>
</Pivot>
最后,您必须在页面的 code-behind:
中定义TogglePivotItem
方法
private int originalPosition = 0;
public void TogglePivotItem()
{
if (MyPivot.Items.Contains(HideablePivotItem))
{
//store the position of the item to be readded later
originalPosition = MyPivot.Items.IndexOf(HideablePivotItem);
MyPivot.Items.Remove(HideablePivotItem);
}
else
{
MyPivot.Items.Insert(originalPosition, HideablePivotItem);
}
}
我正在存储 PivotItem
的原始位置,以便它可以再次 re-added 到同一个地方。