1

WPF のデータ バインディングを使用して、オブジェクト ソースからのデータを ListBox に入力しようとしています。

ソースは、データが xml ファイルから読み込まれる ObjectDataProvider です。XML ファイルを読み込んで適切なデータ構造を入力し、ObjectDataProvider の ObjectInstance をデータ構造に設定します。

データ構造は次のとおりです。

public class Element
{
       public decimal myValue;

       public decimal df_myValue { get { return myValue; } set { this.myValue = value; } }
}

public class BasicSet
{
       public Element[] elementSet;

       public Element[] df_elementSet { get { return elementSet; } set { this.elementSet = value; } }
}

public class DataSet
{
        public BasicSet[] basicSet;

    public BasicSet[] df_basicSet { get { return basicSet; } set { this.basicSet = value; } }
}

XAML は次のとおりです。

<UserControl.Resources>
    <ResourceDictionary>
        <ObjectDataProvider x:Key="TheData" />

        <DataTemplate x:Key="ElementTemplate">
            <StackPanel>
                <TextBox Text="{Binding, Path=df_myValue}" />
            </StackPanel>
        </DataTemplate>

        <HierarchicalDataTemplate x:Key="ElementSetTemplate" ItemsSource="{Binding Path=df_elementSet}" ItemTemplate="{StaticResource ElementTemplate}">
        </HierarchicalDataTemplate>

    </ResourceDictionary>
</UserControl.Resources>

<Grid>
    <ListBox ItemsSource="{StaticResource TheData}" ItemTemplate="{StaticResource ElementSetTemplate}">
    </ListBox>
</Grid>

以下は、xml データがロードされているコード ビハインドです。

    private DataSet m_dataSet;
    private ObjectDataProvider mODP;

    public void LoadXml(EditorContext context, XmlValidator.Context validator, XmlDocument doc)
    {
        mODP = FindResource("TheData") as ObjectDataProvider;

        XmlSerializer xs = new XmlSerializer(typeof(DataSet));
        XmlReader r = new XmlNodeReader(doc.DocumentElement);
        m_dataSet = (DataSet)xs.Deserialize(r);

        mODP.ObjectInstance = m_dataSet;
    }

望ましい結果は、ListBox がデータ構造の各要素に対して TextBox を持つことです。理由により、データ構造が階層的であることに注意してください。問題を単純化するためにデータ構造を平坦化することはできません。

ブレークポイントを配置してチェックすることができ、すべてのデータが正常に見えるため、xml データがデータ構造に正しく読み込まれていることは確かです。しかし、プログラムを実行すると、ListBox には何も表示されません。

どんな助けでも大歓迎です。

4

1 に答える 1

4

私は自分が間違っていたことを理解しました。いくつかの間違いがありました。主なポイントは次のとおりです。

1) itemsControl を使用する必要がありました

2) HierarchicalDataTemplate を使用する必要はありませんでした

3) 3 つのレベルのコントロールが必要でした。itemsControl 内の itemsControl 内の TextBox です...これは、2 つの DataTemplates を使用して実現できます。最上位の itemsControl は、内部の itemsControl を保持する DataTemplate を参照します。その itemsControl は、内部の TextBox を保持する DataTemplate を参照します。

そして、ここに正しいxamlがあります:

<UserControl.Resources>
    <ResourceDictionary>
        <ObjectDataProvider x:Key="TheData" />

        <DataTemplate x:Key="ElementTemplate">
            <TextBox Text="{Binding Path=df_myValue}"/>
        </DataTemplate>

        <DataTemplate x:Key="ElementSetTemplate">
            <GroupBox Header="I am a GroupBox">
                <ItemsControl ItemsSource="{Binding Path=df_elementSet}" ItemTemplate="{StaticResource ElementTemplate}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
            </GroupBox>
        </DataTemplate>

    </ResourceDictionary>
</UserControl.Resources>

<Grid>
    <ItemsControl ItemsSource="{Binding Source={StaticResource TheData}, Path=df_basicSet}" ItemTemplate="{StaticResource ElementSetTemplate}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>

これが他の誰かに役立つことを願っています...

于 2011-05-15T16:02:52.427 に答える