2013-09-29 6 views
0

Здравствуйте, я пытаюсь динамически изменить DataTemplate, но мой метод SelectTemplate в классе TreeViewItemTemplateSelector никогда не вызывался (я проверил его отладчиком) :(Пожалуйста, помогите мне :)WPF datatemplateselector не вызывался

код из XAML MainWindow:

код в код позади:

+0

Ваш XAML выглядит немного неправильным, может быть его частью (ваш селектор в «Window.Resources» ссылается на статические ресурсы, которые не существуют в указанном XAML, и ваш «TreeView.ItemSource» установлен to '{Binding}', должен быть '{Binding listmy}' от внешнего вида. – Psytronic

+0

Thx Psytronic для anwser, но когда я использую {Binding listmy} Я не вижу никаких элементов в своем treeView Я прокомментировал сейчас линия в MainWindow(): //this.datacontext=listmy; и в XAML Я удалил тег к – matti2515

+0

Ааа, да, жаль пропустил эту линию делать. вы получаете какие-либо ошибки в окне вывода при запуске приложения? – Psytronic

ответ

0

Ваша проблема заключается в том, что ваш TreeViewCustomItem наследуется от TreeViewItem. (Как видно из http://pastebin.com/jnP2nWMF)

Удаление этого наследования (и свойства зависимостей) приводит к тому, что селектор шаблонов срабатывает нормально. Что вы пытаетесь достичь с помощью элемента узла?

Глядя на OutputWindow, я получаю сообщение:

System.Windows.Data Error: 26 : ItemTemplate and ItemTemplateSelector are ignored for items already of the ItemsControl's container type; Type='TreeViewCustomItem'

Вы не должны иметь элементы наследуют от TreeViewItem, чтобы связать их с TreeView, TreeViewItem является то, что TreeView используется для хранения данных, а затем DataTemplate используется для представления данных.

+0

Мне не нужна эта собственность, которую я использовал ранее ... Thx for help – matti2515

0

Перемещение DataTemplates из TreeView.Resources в Window.Resources

  <Window.Resources><DataTemplate x:Key="DefaultTemplate"> 
      <TextBlock Text="{Binding Header}"></TextBlock> 
     </DataTemplate><DataTemplate x:Key="Regulation"> 
      <TextBlock Text="{Binding Path=Header}" FontWeight="Bold"></TextBlock> 
     </DataTemplate> 

     <DataTemplate x:Key="Article"> 
      <TextBlock Text="{Binding Path=Header}" Foreground="Green"></TextBlock> 
     </DataTemplate>   
<local:TreeViewItemTemplateSelector x:Key="TemplateSelector" DefaultTemplate="{StaticResource DefaultTemplate}" ArticleTemplate="{StaticResource Article}" RegulationTemplate="{StaticResource Regulation}" /> 

и внести изменения

<TreeView ItemTemplateSelector="{StaticResource TemplateSelector}" Height="409" HorizontalAlignment="Left" Margin="10,10,0,0" Name="treeView1" VerticalAlignment="Top" Width="277" ItemsSource="{Binding}"/> 

Обновить код и мы посмотрим. Я поместил аналогичный код в VS, и он работает, поэтому нам нужно взглянуть более внимательно. Таким образом, я проверил это и изменил

public class TreeViewCustomItem 
{ 
    public string Header { get; set; } 
} 

и это

listmy = new ObservableCollection<TreeViewCustomItem> { new TreeViewCustomItem { Header = "xD" }, new TreeViewCustomItem { Header = "xxD" } }; 
     //treeView1.ItemsSource = listmy; 
     this.DataContext = listmy; 

public class selector : DataTemplateSelector 
{ 

    public DataTemplate RegulationTemplate { get; set; } 

    public DataTemplate DefaultTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     TreeViewCustomItem treeViewItem = item as TreeViewCustomItem; 
     if (treeViewItem.Header == "xD") 
     { 
      return RegulationTemplate; 
     } 

     else 
     { 
      return DefaultTemplate; 

     } 
    } 
} 

и в XAML выглядит следующим образом

  xmlns:local="clr-namespace:WpfApplication1.Views"> 
    <Window.Resources> 
     <DataTemplate x:Key="DefaultTemplate"> 
      <TextBlock Text="{Binding Header}"></TextBlock> 
     </DataTemplate> 
     <DataTemplate x:Key="Regulation"> 
      <TextBlock Text="{Binding Path=Header}" FontWeight="Bold"></TextBlock> 
     </DataTemplate> 
    <local:selector x:Key="selector_" DefaultTemplate="{StaticResource DefaultTemplate}" RegulationTemplate="{StaticResource Regulation}"/> 
</Window.Resources> 
    <Grid> 
     <TreeView Height="409" HorizontalAlignment="Left" Margin="10,10,0,0" Name="treeView1" VerticalAlignment="Top" Width="277" 
      ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource selector_}"/>  

</Grid> 

И это работает так, моя самонадеянность, что проблема находится внутри TreeViewCustomItem.

+0

Это не сработало :(вот мой код позади и xaml xaml: http://pastebin.com/kb5U8NaC код позади: http://pastebin.com/YEzQcHh2 – matti2515

+0

@ matti2515 Когда я беру этот код из вашего pastebin (и удалите ссылки класса DAL класса «Model.Y»), он работает так, как ожидается, удаляется точка останова в классе выбора шаблона. – Psytronic

+0

Спасибо, Psychotronic, вы могли бы поместить этот измененный код здесь или где-нибудь? Потому что это странно, это странно :(Я сделал то же самое, и это не ударило ...:/ – matti2515

Смежные вопросы