Silverlight-Accordion-Steuerelement mit Dynamischen Inhalten
Bin ich mit dem Silverlight-Toolkit ' s Accordion-Steuerelement. Ich wollte eine Liste mit Steuerelementen, die konnte ich laden, in dem Akkordeon und ersetzen on the fly, wenn nötig. So, hier ist was ich getan habe:
- Erstellen Sie eine Klasse zu halten, die header und Inhalte der einzelnen Akkordeon-Element.
public class AccordionViewItem
{
öffentliche AccordionViewItem()
{
ItemsControlContent = new 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; }
}
Habe ich einige zusätzliche Eigenschaften hier, die nicht benötigt werden, bis ich mein problem. Für jetzt, ich wollte nur zeigen das Kopf-und ItemsControlContext Eigenschaften.
- Erstellt das Akkordeon-Steuerelement.
<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>
Also wenn ich den datacontext und senden Sie in einer Liste von AccordionViewItems bekomme ich ein funktionierendes Akkordeon, aber eigentlich wollte ich meine AccordionView Element Aussehen:
public class AccordionViewItem
{
public AccordionViewItem()
{
Content = new StackPanel();
}
public string Header { get; set; }
public FrameworkElement Content { get; set; }
}
Also schuf ich ein custom control namens 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>
Code Hinter:
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; }
}
}
Ändern Sie dann das Akkordeon Verwendung der neuen Steuerung:
<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>
Aber ich bekomme die folgende Fehlermeldung nach dem ItemControl Konstruktor wird ausgeführt:
AG_E_PARSER_BAD_PROPERTY_VALUE [Zeile: 1 Position: 197]
Irgendeine Idee warum ich diese Fehlermeldung bekommen? Gibt es einen anderen Weg zum laden in einem Steuerelement dynamisch? Ich versuche, so wenig code in der code-behind-wie kann ich (MVVM). Irgendwelche Ideen wäre toll.
Dank,
Jamin Roth
InformationsquelleAutor Jamin | 2010-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich eine einfache Lösung. Sie können den ContentPresenter. So können Sie es verwenden, wie das benutzerdefinierte Steuerelement haben soll. So können Sie ersetzen:
Mit:
nicht nur, dass es laden Sie Ihre Inhalte dynamisch, aber Sie können Strecken Sie die Breite anders als bei den ItemsControl.
InformationsquelleAutor Jamin