2

我想將內容控件綁定到數據模板選擇器,將變量綁定到該內容控件,然後根據變量包含的內容顯示不同的模板。將數據模板選擇器綁定到內容控件模板

我已經設法讓Telerik DataTemplateSelector做我所需要的,但是我找不到控制來綁定DataTemplateSelector

我發現允許我使用DataTemplateSelector的所有控件都要求ItemsSource是一個集合,如果我傳入一個對象,它會引發異常。

我傳入的項目是單個項目而不是集合。內容控制似乎是我需要的,但我不能將DataTemplateSelector綁定到它。

是否有一個類似於內容控制的telerik控件,我可以將DataTemplateSelector綁定到?或者是有類似的DataTemplateSelector,我可以綁定到內容控制

任何幫助將不勝感激。

+0

有了這樣的延遲...但我給你一個答案(我剛剛發現了這個問題!)!也許可以幫助別人... – MAXE

回答

3

我認爲你應該考慮避免Telerik的類(在我看來,這使得事情在這種情況下有點複雜)。

標準DataTemplateSelector實施情況如何? 自己實現起來非常簡單!

首先聲明一個 「經典」 實施抽象DataTemplateSelector的:

public abstract class DataTemplateSelector : ContentControl 
{ 
    public virtual DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     return null; 
    } 

    protected override void OnContentChanged(object oldContent, object newContent) 
    { 
     base.OnContentChanged(oldContent, newContent); 

     ContentTemplate = SelectTemplate(newContent, this); 
    } 
} 

然後,你可以自定義DataTemplateSelector寫你......

public class myTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate Template1 { get; set; } 

    public DataTemplate Template2 { get; set; } 


    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     // No template... 
     if (item == null) 
      return null; 

     // Enumeration discriminant: 
     if (item is BoundTemplateDiscriminantType) 
      switch ((BoundTemplateDiscriminantType)item) 
      { 
       case BoundTemplateDiscriminantType.Type1: 
        return Template1; 
       case BoundTemplateDiscriminantType.Type2: 
        return Template2; 
       // Not implemented... 
       default: 
        throw new NotImplementedException(); 
      } 
     // Integer discriminant: 
     else if (item is int) 
     { 
      return (int)item > 0 ? Template1 : Template2; 
     } 
     // Other discriminants... 
     else 
      // Not yet implemented... 
      throw new NotImplementedException(); 
    } 
} 

...終於XAML設計(不是通常的ListBoxItem,但在這種情況下是可滾動的內容):

<ScrollViewer> 
    <ScrollViewer.ContentTemplate> 
     <DataTemplate> 
      <utilities:myTemplateSelector Content="{Binding Path=BoundDiscriminant, Mode=OneWay}"> 
       <!--Content of first template...--> 
       <utils:myTemplateSelector.Template1> 
        <DataTemplate> 
          <TextBlock Text={Binding Path=BoundDescription, Mode=OneWay} />    
        </DataTemplate> 
       </utils:myTemplateSelector.Template1> 
       <!--Content of second template...--> 
       <utils:myTemplateSelector.Template2> 
        <DataTemplate> 

        </DataTemplate> 
       </utils:myTemplateSelector.Template2> 
       ... and so on... 
      </utilities:myTemplateSelector> 
     </DataTemplate> 
    </ScrollViewer.ContentTemplate> 
</ScrollViewer> 
+2

我已經停止使用Telerik和Silverlight開發應用程序,所以我無法驗證這是否會在我的情況下工作,但我已經接受了答案,因爲它可能會幫助其他人。 – Midimatt