1

Silverlight Toolkit のアコーディオン コントロールを使用しています。アコーディオンにロードして、必要に応じてその場で置き換えることができるコントロールのリストを作成したいと考えました。だからここに私がしたことがあります:

  1. 各アコーディオン項目のヘッダーとコンテンツを保持するクラスを作成します。

    public class AccordionViewItem { public AccordionViewItem() { ItemsControlContent = new ObservableCollection(); ItemsControlContent.Add(新しい 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. アコーディオン コントロールを作成しました。

    <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) でできるだけ少ないコードを使用しようとしています。どんなアイデアでも素晴らしいでしょう。

ありがとう、

ジャミン・ロス

4

1 に答える 1

1

簡単な解決策を見つけました。ContentPresenter を使用できます。したがって、カスタム コントロールのように使用できます。したがって、次のように置き換えることができます。

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

と:

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

コンテンツを動的にロードするだけでなく、ItemsControl とは異なり、幅を広げることができます。

于 2010-08-11T18:49:59.693 に答える