2012-01-18 2 views
1

Я создал класс DataTemplateSelector. Я хотел бы применить его к одному элементу, поэтому он выбирает шаблон, основанный на некоторых условиях.Применение DataTemplateSelector к одному элементу

По существу я хотел бы иметь эквивалент этого в XAML:

% if myitem.A 
    <TextBlock Text="{Binding myitem.data }"/> 
% else if myitem.B 
    <Button Content="{Binding myitem.data }"/> 

public class MyTemplateSelector : DataTemplateSelector 
    { 

     public DataTemplate A { 
      get; 
      set; 
     } 

     public DataTemplate B { 
      get; 
      set; 
     } 


     public override DataTemplate SelectTemplate(object item, DependencyObject container) { 
      var myitem = item as MyItem; 
      if (myitem.A) 
       return A; 
      else if (myitem.B) 
       return B; 
      return base.SelectTemplate(item, container); 
     } 

    } 

Как я могу добиться этого?

Спасибо.

+0

Вы видите эту статью Http: //windowsphonegeek.com/articles/Implementing-Windows-Phone-7-DataTemplateSelector-and-CustomDataTemplateSelector? – Ku6opr

+0

Да, но он предполагает, что я имею дело с коллекцией предметов. На моей модели просмотра у меня есть только один элемент, который я хочу выбрать для шаблона. Однако я понятия не имею, как применить его к одному элементу. :. ( – zyash

ответ

4

Если у вас есть один товар, а не список предметов, вы можете использовать ContentPresenter с пользовательским номером ContentTemplate, чтобы показать этот товар. ContentTemplate может использовать TemplateSelector как вы знаете:

 <ContentPresenter x:Name="control"> 
      <ContentPresenter.ContentTemplate> 
       <DataTemplate> 
        <local:MyTemplateSelector Content="{Binding}"> 
         <local:MyTemplateSelector.A> 
          <DataTemplate> 
           <TextBlock Text="null" /> 
          </DataTemplate> 
         </local:MyTemplateSelector.A> 
         <local:MyTemplateSelector.B> 
          <DataTemplate> 
           <TextBlock Text="{Binding}" /> 
          </DataTemplate> 
         </local:MyTemplateSelector.B> 
        </local:MyTemplateSelector> 
       </DataTemplate> 
      </ContentPresenter.ContentTemplate> 
     </ContentPresenter> 

Это мой TemplateSelector:

public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (item == null) 
      return A; 

     return B; 
    } 

И эта линия добавить контент на дисплее:

control.Content = "123"; 
+0

Спасибо - я не могу заставить его работать, хотя я попробовал этот синтаксис: <локальный: MyTemplateSelector Content = "{Binding}"> \t \t \t <локальный : MyTemplateSelector.A> \t \t \t \t \t \t \t \t \t \t \t \t - но ничего не появляется – zyash

+0

вызов 'yourcontrol.Content = myItem;' добавить некоторые данные, чтобы показать – Ku6opr

+0

Ах, я вижу. Атрибут «Контент» ведущего контента как эквивалент, например, ItemsSource в списке. Спасибо! – zyash

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