UWP PivotItem标头可见性绑定

时间:2018-02-27 16:58:05

标签: c# uwp mvvmcross

我在UWP中进行绑定,列表视图没有显示(所以它工作正常),但标题仍在视图中。

所以问题是标题没有从PivotItem获取绑定,可能是什么问题?

<PivotItem Header="Hello" Visibility="{Binding isVisible, Converter={StaticResource Visibility}}">
    <ListView ItemsSource="{Binding myList}"/>
</PivotItem>

1 个答案:

答案 0 :(得分:2)

这实际上有点棘手。在Visibility上设置PivotItem确实只隐藏了项目的内容,而不是PivotItem本身。也就是说,您可以通过完全从枢轴中删除它来将其隐藏在代码隐藏中:

MyPivot.Items.Remove(HideablePivotItem);

现在的问题是你需要在绑定更改时触发它。为此,我建议您使用自定义BehaviorCallMethodAction

首先从NuGet安装Microsoft.Xaml.Behaviors.Uwp.Managed(右键单击您的项目,点击Manage NuGet Packages...使用搜索查找包,然后点击Install

现在,创建一个新的类DataChangeTriggerBehavior类:

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>

最后,您必须在页面的代码隐藏中定义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的原始位置,以便可以将其重新添加到同一个位置。