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:

  1. 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.

  1. 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

Schreibe einen Kommentar