【问题标题】:Make visibility of listbox items to be visible when clicked on a button使列表框项目的可见性在单击按钮时可见
【发布时间】:2015-01-10 21:47:26
【问题描述】:

XAML:

 <ListBox Height="163" HorizontalAlignment="Left" Margin="0,-24,0,0" Name="listBox2" VerticalAlignment="Top" Width="446" SelectedValuePath="" SelectionChanged="listBox2_SelectionChanged" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Vertical">
                                <TextBlock x:Name="LblPassword" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding RegistPassword}" VerticalAlignment="Top" Visibility="Collapsed" Foreground="Black"/>
                                <TextBlock x:Name="LblSecQn" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding SecurityQn}" VerticalAlignment="Top" Margin="10,50,0,0" Visibility="Visible" Foreground="Black"/>
                                <TextBlock x:Name="LblSecAns" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding SecurityAns}" VerticalAlignment="Top" Visibility="Collapsed" Foreground="Black"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
                <TextBlock x:Name="LblEmail" Text="" HorizontalAlignment="Left" Margin="24,59,0,0" TextWrapping="Wrap" Foreground="Black" FontSize="30" VerticalAlignment="Top" Visibility="Collapsed"/>
                <Button x:Name="BtnSubmit" Content="Submit" HorizontalAlignment="Left" Margin="116,316,0,0" VerticalAlignment="Top" Height="88" Width="193" Click="BtnSubmit_Click" Foreground="Black" BorderBrush="Black"/>

.CS:

 private void BtnSubmit_Click(object sender, RoutedEventArgs e)
        {
       ListBoxItem listBoxItem = listBox2.SelectedItem as ListBoxItem;

            DataTemplate listBoxTemplate = listBoxItem.ContentTemplate;

            StackPanel outerStackPanel = listBoxTemplate.content as StackPanel;

            StackPanel innerStackPanel = outerStackPanel.Children[1] as StackPanel;

            TextBlock nameBox = innerStackPanel.Children[2] as TextBlock;
            nameBox.Visibility = Visibility.Visible;

    }

这是我目前的 BtnSubmit_click。但是,listBoxTemplate.content 部分有一些例外。


我想让 LblSecAns 的可见性在我单击 BtnSubmit 时可见。我在谷歌上搜索了ans。它告诉我使用 Visual tree helper。但我不明白,也不知道如何申请。

【问题讨论】:

  • 到目前为止你尝试了什么?你在BtnSubmit_Click里面做什么?

标签: c# windows-phone-8 visual-studio-2013 listbox visibility


【解决方案1】:

如果我理解正确的话,有两种方法可以在这里实现你想要做的事情。

第一个就像你提到的 Visual Tree Helper。基本上每个具有名称 x:Name 的元素都可以使用以下命令“访问”:var nameBox = GetTemplateChild("LblSecAns") as TextBox;

我没有在你的例子中专门测试过这段代码(从 ItemTemplate 中检索一些东西),但它应该可以工作。

从我的角度来看,另一种方法也是最好的方法是创建一个转换器。我一直在使用转换器有很多原因,包括迄今为止项目的可见性,它使事情变得更简单,同时保持代码干净。

可见性转换器如下:

public class VisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (bool)value) ? Visibility.Collapsed : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        return Visibility.Visible;
    }
}

然后您的TextBlock 将更改为:

<TextBlock x:Name="LblSecAns" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding SecurityAns}" VerticalAlignment="Top" Visibility="{Binding notAnswered, Converter={StaticResource VisibilityConverter}}" Foreground="Black"/>

最后,您的按钮 onClick 方法将是:

private void BtnSubmit_Click(object sender, RoutedEventArgs e)
    {
        ListBoxItem listBoxItem = listBox2.SelectedItem as <<ClassOfTheItem>>;

        listBoxItem.notAnswered = false;
}

不要忘记将notAnswered 属性添加到您将列表框绑定到的项目类&lt;&lt;ClassOfTheItem&gt;&gt;。由于我没有您的代码,我建议添加一个新属性,但此步骤可能不是必需的,因为 Visibility 可以绑定到其他内容,即实际答案。

【讨论】:

  • 什么是>?
  • 它的类包含您的项目属性,例如 RegistPasswordSecurityQn。您在Textblocks 等上绑定的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
相关资源
最近更新 更多