我正在使用Silverlight Toolkit的Accordion控件。我想創建一個可以加載到手風琴中的控制列表,並在需要時隨時更換。所以這裏是我所做的:帶動態內容的Silverlight Accordion控件
創建一個類來容納每個手風琴項目的標題和內容。
公共類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屬性。
創建了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)。任何想法都會很棒。
感謝,
賈敏羅斯