【问题标题】:UWP PivotItem Header visibility bindingUWP PivotItem Header 可见性绑定
【发布时间】:2018-02-28 02:43:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# uwp mvvmcross


    【解决方案1】:

    这实际上有点棘手。在PivotItem 上设置Visibility 确实只隐藏了项目的内容,而不是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 的原始位置,以便可以再次将其重新添加到同一位置。

    【讨论】:

    • 很高兴它有帮助:-)。我感谢你的好问题!快乐编码:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2019-01-24
    • 2015-09-30
    • 2013-12-13
    • 2015-06-18
    • 2015-01-10
    • 1970-01-01
    相关资源
    最近更新 更多