【问题标题】:How to toggle the visibility of two buttons using DataTrigger Behavior in XAML, WP 8.1?如何使用 XAML、WP 8.1 中的 DataTrigger 行为切换两个按钮的可见性?
【发布时间】:2015-02-13 05:55:51
【问题描述】:

我有两个按钮 - 按钮 A 和按钮 B。最初两个按钮都是隐藏的。数据是从 Observable Collection OCollection 中获取的。

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

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

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

3) 在其余的点击中(点击任何其他列表视图项,除了按钮 A 保持可见的项),按钮 B 应该可见。并且按钮 A 的可见性不应变回 Collapsed。

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

OCollection 设置为 ListView 的 ItemSource。 每个 ListView 项都是一个包含默认图像的 Grid。

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 模式,所以再见 Code behind。

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

类:

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

【问题讨论】:

    标签: c# xaml mvvm microsoft-metro windows-phone-8.1


    【解决方案1】:

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

    这里是:

    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 的​​含义,并且您知道如何将按钮的可见性绑定到 bool 属性。有什么不懂的地方告诉我。

    【讨论】:

    • @w-d 我在帖子中添加了一些代码,试一试,告诉我进展如何
    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2023-03-24
    • 2014-06-08
    相关资源
    最近更新 更多