如何使用 XAML 中的数据触发器行为切换两个按钮的可见性,WP 8.1

本文关键字:按钮 两个 可见性 WP 数据 XAML 何使用 触发器 | 更新日期: 2023-09-27 18:34:11

我有两个按钮 - 按钮A和按钮B。两者最初都保持隐藏状态。数据是从可观察集合OCollection中获取的。

这就是我想要实现的目标:

1(最初,两个按钮都是隐藏的。(完成(

2( 在第一次单击(单击任何列表视图项(时,按钮 A 应可见。(完成(

3( 在其余点击时(单击任何其他列表视图项,除了按钮 A 保持可见的项目之外(,按钮 B 应可见。按钮 A 的可见性不应更改回"折叠"。

注意:每个列表视图项只能包含一个按钮(按钮 A 或按钮 B(。

OCollection被设置为列表视图的ItemSource。每个列表视图项都是一个包含默认图像的网格。

XAML:

     <ListView Name="lv" 
              ItemsSource="{Binding OCollection}" 
              Background="Linen"                  
              Grid.ColumnSpan="3">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Background="LightGray" Name="buttonGrid" Tag="{Binding dumyString}">
                    <i:Interaction.Behaviors>
                        <ic:DataTriggerBehavior Binding="{Binding ElementName=lv, Path=SelectedValue.dumyString}" Value="{Binding dumyString}" ComparisonCondition="Equal">
                            <ic:ChangePropertyAction TargetObject="{Binding ElementName=ButtonA}" PropertyName="Visibility" Value="Visible" />
                        </ic:DataTriggerBehavior>
                        <ic:DataTriggerBehavior Binding="{Binding ElementName=lv, Path=SelectedValue.dumyString}" Value="{Binding dumyString}" ComparisonCondition="NotEqual">
                            <ic:ChangePropertyAction TargetObject="{Binding ElementName=ButtonA}" PropertyName="Visibility" Value="Collapsed" />
                        </ic:DataTriggerBehavior>
                        <ic:DataTriggerBehavior Binding="{Binding ElementName=lv, Path=buttonGrid.Tag}" Value="{Binding dumyString}" ComparisonCondition="Equal">
                            <ic:ChangePropertyAction TargetObject="{Binding ElementName=ButtonB}" PropertyName="Visibility" Value="Visible" />
                        </ic:DataTriggerBehavior>                            
                    </i:Interaction.Behaviors>
                    <Image Source="/Assets/Logo.png" />
                    <Button Name="ButtonA" Content="ButtonA" Background="Black" Visibility="Collapsed" />
                    <Button Name="ButtonB" Content="ButtonB" Background="Black" Visibility="Collapsed" />
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

为了实现 3,我将网格的标签与按钮内容进行比较。它不起作用,因为逻辑是错误的。那么,如何在不使用代码隐藏的情况下实现这一点。我正在遵循 MVVM 模式,所以在后面的代码是再见的。

样本会很好,因为我只是一个初学者。

类:

public class dumyClass
{
    public string dumyString { get; set; }
}

如何使用 XAML 中的数据触发器行为切换两个按钮的可见性,WP 8.1

我认为您可以在视图模型中订阅 CollectionChanged 事件,然后将按钮的可见性绑定到布尔属性并通过更改属性的值来处理您的事件。不要忘记布尔到可见性转换器。如果需要,我可以给你一些代码示例。

这是:

public FooViewModel()
    {
        this.OCollection += this.OCollectionChanged;
    }
    private void OCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        var collection = sender as System.Collections.Generic.List<Bar>;
        if (collection != null && collection.Count > 1)
        {
            this.IsButtonVisible = true;
            base.RaisePropertyChanged(() => this.IsButtonVisible);
        }
    }

如果您使用的是 MVVM,我希望您知道 RaisePropertyChanged 的含义,并且您知道如何将按钮的可见性绑定到布尔属性。如果您无法理解,请告诉我。