Изменить видимость элемента ListBox

У меня есть окно с несколькими элементами в нем, например TextBlock, Image и т.д.

Теперь в файле XAML вся видимость элементов будет свернута в моем файле .CS на основе условия, в котором я определяю, какой элемент должен отображаться, например, мне нужно отображать только TextBlock или Image, но поскольку все видимость элементов сворачивается по умолчанию, как динамически изменять видимость 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>

ИЗМЕНИТЬ

Я paht в моем файле .CS к источнику изображения, подобному этому:

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

Теперь в файле Image XAML как связать этот путь с ним?

Обычно мы делаем это следующим образом:

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

здесь MyImage - это имя изображения в файле XAML, но в моем случае я не могу получить имя изображения, которое находится в списке, поэтому теперь, как связать данные?

Ответ 1

Просто добавьте свойства TextVisiblity и ImageVisibility в вашу модель просмотра. Затем привяжите их напрямую:

<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, см. здесь для полного примера того, как это сделать.)

Ответ 2

вот как я получаю элемент списка в коде.

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

и вот как я делаю это невидимым.

 lbi.Visibility = Visibility.Collapsed;