【问题标题】:Change ListBox item visibility更改 ListBox 项目的可见性
【发布时间】:2014-02-14 06:24:11
【问题描述】:

我有一个列表框,其中包含多个项目,例如 TextBlock、Image 等...

现在在 XAML 文件中,所有项目的可见性都将被折叠,在我的 .CS 文件中,我根据一个条件决定要显示的项目,就像我只需要显示 TextBlock 或图像一样,但由于所有项目的可见性默认情况下都是折叠的,如何动态改变 ListBoxItems 的可见性并将数据或图像设置到项目?

这是我的 XAML 代码:

<ListBox Name="listBox" 
         HorizontalContentAlignment="Stretch" 
         VerticalContentAlignment="Stretch" 
         SelectionChanged="TopicListboxSelectionChanged"
         ScrollViewer.VerticalScrollBarVisibility="Disabled">
         <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Name="CellBack" Margin="0,0,0,4" Orientation="Horizontal">
                            <Border Name="borderColor" Background="#FFF2F4F7">
                                <TextBlock Name="text"
                                       Width="456"
                                       Padding="10,20,10,20"
                                       Visibility="Collapsed"
                                       TextAlignment="Center"
                                       Text="{Binding Path=Value}"
                                       Style="{StaticResource TextStyle}"/>
                            </Border>
                               <Image Name="Image"
                                       Grid.Row="0"
                                       Visibility="Collapsed"
                                       Width="Auto"
                                       Height="Auto"
                                       HorizontalAlignment="Center"
                                       VerticalAlignment="Center"
                                       Margin="1,1,1,1"/>
                        </StackPanel>
                     </DataTemplate>
                </ListBox.ItemTemplate>

编辑

我的 .CS 文件中的图像源如下所示:

image = "Path to my soucre" + imagename +"phone.png";

现在如何在 XAML 文件中的 Image 中绑定这个路径呢?

通常我们这样做:

BitmapImage bmp = new BitmapImage(new Uri(fileName, UriKind.Relative));
                MyImage.Source = bmp;

这里 MyImage 是 XAML 文件中 Image 的名称,但在我的情况下,我无法获取列表框中的图像名称,所以现在如何绑定数据?

【问题讨论】:

  • 你如何决定哪个控件可见,有DataDataContext这个吗?
  • 我有一个对象,我可以检查它是否包含图像或文本,基于我必须使文本块或图像显示或显示在屏幕上,但该怎么做呢?跨度>
  • 您的Object 在哪里?在ListItemDataContext 中?
  • 这里的 DataContext 是什么?我不知道,我的 .CS 文件中有我的对象

标签: c# wpf xaml windows-phone-8 windows-phone


【解决方案1】:

只需将属性TextVisiblityImageVisibility 添加到您的视图模型。然后直接绑定它们:

<DataTemplate>
    <StackPanel>
        <TextBlock Visibility="{Binding TextVisibility}" ... />
        <Image Visibility="{Binding ImageVisibility}" ... />
    </StackPanel>
</DataTemplate>

属性可以是只读的,例如:

public Visibility TextVisibility
{
    get { return Value == null ? Visibility.Collapsed : Visibility.Visible; }
}

或者,如果您不想修改模型类,可以使用IValueConverter,例如:

<TextBlock Visibility="{Binding Converter={StaticResource ModelToTextVisibility}" ... />

(为此,您必须编写 ModelToTextVisibility 类,有关如何执行此操作的完整示例,请参阅 here。)

【讨论】:

  • 好的,你的意思是说我需要在我的类中添加这个gettersetter方法,并将可见性设置为我的文本?是这样吗?但是我如何在这里设置可见性?我很困惑,请您详细说明
  • 好的,让我试试,我会回复你的
  • 好的,我已经这样做了 string text = myObject.Text;并在方法 public Visibility TextVisibility { get { return text == null ? Visibility.Collapsed : Visibility.Visible; } } 这样好吗?它会工作吗?
【解决方案2】:

这就是我在代码中获取列表框项的方式。

 ListBoxItem lbi = listBox.ItemContainerGenerator.ContainerFromIndex(listBox.SelectedIndex) as ListBoxItem;

我就是这样让它不可见的。

 lbi.Visibility = Visibility.Collapsed;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2019-07-29
  • 2012-01-22
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多