public class ListItemTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultnDataTemplate { get; set; }
public DataTemplate NoteDataTemplate { get; set; }
public DataTemplate SelectedNoteDataTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (null == item)
return DefaultnDataTemplate;
var lb = container as ListBox;
if (item == lb.SelectedItem)
return SelectedNoteDataTemplate;
else
return NoteDataTemplate;
}
}
Почему при запуске после выполнения lb = container as ListBox lb пусто? В container Listbox не приходит, а приходит ContentPresenter какой-то. Как мне ListItemTemplateSelector выбирать темплейт для Listbox?
Re: WPF - DataTemplateSelector для ListBox не работает
Здравствуйте, takTak, Вы писали:
T>с binding где-то накосячил, я вообще не понимаю, как можно в 2018 году свои selectors сочинять... опенсорсного добра же дофига...
T>возьми Snoop да посмотри, на что ты свой лист набайндил
1. Чтобы Snoop взять надо прежде Win 8.1 SDK поставить
2. Если комменчу эту строку, то видно что ListBox привязан правильно, к тому списку, что мне нужен.
Re[3]: WPF - DataTemplateSelector для ListBox не работает
тогда попробуй пройтись в SelectTemplate по container и найти в нём свой parent или child или чего там
var parent = container;
// Search up the visual tree, stopping at either a ListBox or
// a ListItem (or null). This will determine which template to usewhile(parent != null && !(parent is ListItem) && !(parent is ListBox ))
parent = VisualTreeHelper.GetParent(parent);
...
Здравствуйте, senglory, Вы писали:
S>Вот код ListItemTemplateSelector
S>
S>public class ListItemTemplateSelector : DataTemplateSelector
S> {
S> public DataTemplate DefaultnDataTemplate { get; set; }
S> public DataTemplate NoteDataTemplate { get; set; }
S> public DataTemplate SelectedNoteDataTemplate { get; set; }
S> public override DataTemplate SelectTemplate(object item, DependencyObject container)
S> {
S> if (null == item)
S> return DefaultnDataTemplate;
S> var lb = container as ListBox;
S> if (item == lb.SelectedItem)
S> return SelectedNoteDataTemplate;
S> else
S> return NoteDataTemplate;
S> }
S> }
S>
S>Почему при запуске после выполнения lb = container as ListBox lb пусто? В container Listbox не приходит, а приходит ContentPresenter какой-то. Как мне ListItemTemplateSelector выбирать темплейт для Listbox?
SelectTemplate вызывается до приcвоения нового значение свойства SelectedItem
нужно в item соотв. свойство завести — выбран он или нет, выглядит может и избыточно но работать должно
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re[4]: WPF - DataTemplateSelector для ListBox не работает
K>SelectTemplate вызывается до приcвоения нового значение свойства SelectedItem K>нужно в item соотв. свойство завести — выбран он или нет, выглядит может и избыточно но работать должно
Так в ListBoxItem и так есть свойство IsSelected, зачем еще и в данных его заводить?
Re[5]: WPF - DataTemplateSelector для ListBox не работает
S>И никакого эффекта. Т.е. не то что оранжевым выбранный не окрашивается, а вообще он не меняется. ЧЯДНТ?
опять изобретаешь свой велосипед, не понимая, что именно ты делaешь, возьми один-в-один пример, на котором на stackoverflow 170 подтверждений, обрати внимание, что у тебя в проекте нет переопределённых стилей где-то ещё, тогда всё должно работать, после этого пробуешь изменять какие-то другие, нежели указанные свойства
посмотрел в тот пример, на который я ссылался, там меняется Foreground, вот начни с него и один-в-один с приведённого примера,
snoop тебе тоже поможет, там ошибки в привязке тоже видны, как видны они и в debug-окошке visual studio, если ты изменишь свойства , просто погугли как эти настройки изменить
Re[3]: WPF - DataTemplateSelector для ListBox не работает
Здравствуйте, senglory, Вы писали:
K>>SelectTemplate вызывается до приcвоения нового значение свойства SelectedItem K>>нужно в item соотв. свойство завести — выбран он или нет, выглядит может и избыточно но работать должно
S>Так в ListBoxItem и так есть свойство IsSelected, зачем еще и в данных его заводить?
да, в WPF и это не работает, DataTemplate выбирается только при добавлении элемента(биндинге) коллекции и потом уже на изменение его свойств не реагирует.
тогда в твоем случае надо выбирать темплейт для разных типов в селекторе, а выбранность обрабатывать в каждом из них через стиль например
S>Почему при запуске после выполнения lb = container as ListBox lb пусто? В container Listbox не приходит, а приходит ContentPresenter какой-то. Как мне ListItemTemplateSelector выбирать темплейт для Listbox?
Переопредели ItemContainerStyle, сделай у объекта свойство IsSelected и забинди его в стиле на LIstBoxItem.IsSelected