Изменить видимость элемента 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;