Информация об изменениях

Сообщение Re[3]: WPF - DataTemplateSelector для ListBox не работает от 03.09.2018 10:37

Изменено 03.09.2018 10:38 ksg71

Re[3]: WPF - DataTemplateSelector для ListBox не работает
Здравствуйте, senglory, Вы писали:

K>>SelectTemplate вызывается до приcвоения нового значение свойства SelectedItem

K>>нужно в item соотв. свойство завести — выбран он или нет, выглядит может и избыточно но работать должно

S>Так в ListBoxItem и так есть свойство IsSelected, зачем еще и в данных его заводить?


да, в WPF и это не работает, DataTemplate выбирается только при добавлении элемента(биндинге) коллекции и потом уже на изменение его свойств не реагирует.
тогда в твоем случае надо выбирать темплейт для разных типов в селекторе, а выбранность обрабатывать в каждом из них через стиль например

<ListBox x:Name="listBox" VerticalAlignment="Top"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<StackPanel.Style>
<Style TargetType="StackPanel">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"
Value="True">
<Setter Property="Background" Value="Orange" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<TextBlock Text="Name:" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Re[3]: WPF - DataTemplateSelector для ListBox не работает
Здравствуйте, senglory, Вы писали:

K>>SelectTemplate вызывается до приcвоения нового значение свойства SelectedItem

K>>нужно в item соотв. свойство завести — выбран он или нет, выглядит может и избыточно но работать должно

S>Так в ListBoxItem и так есть свойство IsSelected, зачем еще и в данных его заводить?


да, в WPF и это не работает, DataTemplate выбирается только при добавлении элемента(биндинге) коллекции и потом уже на изменение его свойств не реагирует.
тогда в твоем случае надо выбирать темплейт для разных типов в селекторе, а выбранность обрабатывать в каждом из них через стиль например

<ListBox x:Name="listBox" VerticalAlignment="Top" 
                 ItemsSource="{Binding Items}"
                 SelectedItem="{Binding SelectedItem}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <StackPanel.Style>
                            <Style TargetType="StackPanel">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}" 
                                                 Value="True">
                                        <Setter Property="Background" Value="Orange" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </StackPanel.Style>
                        <TextBlock Text="Name:"  />
                        <TextBlock Text="{Binding Name}"   />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>