2010-02-19 87 views
1

我正在使用Silverlight Toolkit的Accordion控件。我想創建一個可以加載到手風琴中的控制列表,並在需要時隨時更換。所以這裏是我所做的:帶動態內容的Silverlight Accordion控件

  1. 創建一個類來容納每個手風琴項目的標題和內容。

    公共類AccordionViewItem { 公共AccordionViewItem() { ItemsControlContent =新的ObservableCollection(); ItemsControlContent.Add(new StackPanel()); }

    public string Header { get; set; } 
    public FrameworkElement Content 
    { 
        get { return ItemsControlContent[0]; } 
        set { ItemsControlContent[0] = value; } 
    } 
    
    public ObservableCollection<FrameworkElement> ItemsControlContent { get; set; } 
    

    }

我有不需要的,直到我提出我的問題,在這裏一些額外的屬性。現在我只想顯示Header和ItemsControlContext屬性。

  1. 創建了Accordian控件。

    <layoutToolkit:Accordion x:Name="AccordionHost" ItemsSource="{Binding Path=Panels}" SelectionMode="One" VerticalAlignment="top" HorizontalAlignment="Center" > 
        <layoutToolkit:Accordion.ItemTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock Text="{Binding Header}" /> 
          </StackPanel> 
         </DataTemplate> 
        </layoutToolkit:Accordion.ItemTemplate> 
        <layoutToolkit:Accordion.ContentTemplate> 
         <DataTemplate> 
          <ItemsControl ItemsSource="{Binding Path=ItemsControlContent}" /> 
         </DataTemplate> 
        </layoutToolkit:Accordion.ContentTemplate> 
    </layoutToolkit:Accordion> 
    

所以,如果我設置的datacontext和AccordionViewItems的名單,我可以得到一個正常運作的手風琴送,但我真的希望有我的AccordionView項目的樣子:

public class AccordionViewItem 
{ 
    public AccordionViewItem() 
    { 
     Content = new StackPanel(); 
    } 

    public string Header { get; set; } 
    public FrameworkElement Content { get; set; } 
} 

所以我創建了一個名爲ItemControl自定義控件:

<UserControl x:Class="ECAPortal.Client.Common.Controls.ItemControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="400" 
    Width="300" > 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <ItemsControl x:Name="itemsControlLoader" /> 
    </Grid> 
</UserControl> 

代碼背後:

public partial class ItemControl : UserControl 
{ 
    private ObservableCollection<FrameworkElement> m_controls = new ObservableCollection<FrameworkElement>(); 

    public ItemControl() 
    { 
     m_controls.Add(new StackPanel()); 

     InitializeComponent(); 

     this.Loaded += new RoutedEventHandler(ItemControl_Loaded); 
    } 

    void ItemControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     itemsControlLoader.ItemsSource = m_controls; 
    } 

    public FrameworkElement ItemSource 
    { 
     get { return m_controls[0]; } 
     set { m_controls[0] = value; } 
    } 
} 

然後改變手風琴使用新的控制:

<layoutToolkit:Accordion x:Name="AccordionHost" ItemsSource="{Binding Path=Panels}"  SelectionMode="One" Margin="0,50" Width="740" VerticalAlignment="top"  HorizontalAlignment="Center" > 
     <layoutToolkit:Accordion.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Header}" /> 
       </StackPanel> 
      </DataTemplate> 
     </layoutToolkit:Accordion.ItemTemplate> 
     <layoutToolkit:Accordion.ContentTemplate> 
      <DataTemplate> 
       <controls:ItemControl ItemSource="{Binding Content}" /> 
      </DataTemplate> 
     </layoutToolkit:Accordion.ContentTemplate> 
    </layoutToolkit:Accordion> 

,但我得到了以下錯誤ItemControl構造函數運行後:

AG_E_PARSER_BAD_PROPERTY_VALUE [線路:1個位置:197]

任何想法,爲什麼我得到這個錯誤?是否有另一種方式來動態加載控件?我試圖在後面的代碼中使用盡可能少的代碼(MVVM)。任何想法都會很棒。

感謝,

賈敏羅斯

回答

1

我發現了一個簡單的解決方案。您可以使用ContentPresenter。所以你可以像使用自定義控件一樣使用它。所以,你可以替換:

<controls:ItemControl ItemSource="{Binding Content}" /> 

有了:

<ContentPresenter Content="{Binding Content}" /> 

它不僅動態加載您的內容,但可以舒展寬不像ItemsControl的。