Привязка видимости CheckBox к свойству IsSelected элемента в списке

86
04 февраля 2021, 02:30

Необходимо соблюдение MVVM

Проблема такова, я через ItemsSource передаю в список коллекцию объектов. Шаблон данного списка выглядит так:

<ListBox ItemsSource="{Binding ItemList}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        <TextBlock Text="{Binding Title}" FontSize="15"/>
        <TextBlock Text="{Binding Description}" FontSize="13"/>
        <TextBlock Text="{Binding Price}" FontSize="13"/>
        <CheckBox/>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

И как видите там в конце шаблона затисался CheckBox. Я хочу сделать так, чтобы он был видимым только тогда, когда данный элемент выбран, т.е. у других объектов он будет невидимым, пока их не выберут, но проблема в том, что мы передаем напрямую список объектов, а не привычный ListBoxItem, у которого можно было бы привязать видимость чекбокса к свойству IsSelected элемента и дальше использовать конвертер. Что в такой ситуации можно сделать?

Answer 1

Создадим стиль для ListBoxItem:

<Style x:Key="MyListboxItemStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border>
                    <Grid>
                        <TextBlock Text="{Binding Title}" FontSize="15"/>
                        <TextBlock Text="{Binding Description}" FontSize="13"/>
                        <TextBlock Text="{Binding Price}" FontSize="13"/>
                        <CheckBox x:Name="CB" Opacity="0" />
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="CB" Property="Opacity" Value="1" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Собственно, создавать его по хорошему нужно не с нуля, а на основе уже существующего (и использующегося у вас стиля), куда аккуратненько подпихнуть это.

Сам же код Listbox'a будет выглядеть вот так:

<ListBox ItemsSource="{Binding ItemList}" ItemContainerStyle="{DynamicResource MyListboxItemStyle}"></ListBox>

В нем больше нет необходимости задавать ItemTemplate, ибо все это уже задано в стиле.

READ ALSO
C# MapCamera : Singleton&lt;MapCamera&gt; выдает ошибку

C# MapCamera : Singleton<MapCamera> выдает ошибку

В Unity3d при создании класса "public class MapCamera : Singleton" выдает ошибку: - The namespace '' already contains a definition for 'MapCamera'Что я делаю не так?

127
Как получить только версию windows без доп

Как получить только версию windows без доп

В наличие есть рабочий код:

104
Не работает кнопка в элементе списка

Не работает кнопка в элементе списка

В общем, есть такой список

99
C#. AspNetCore2.2. Exception при использовании библиотеки NCalc из разных потоков

C#. AspNetCore2.2. Exception при использовании библиотеки NCalc из разных потоков

на одном из Продакшен серверов возникло исключение

98