2009-07-27 8 views
1

私は文字列の2つの配列を持つオブジェクトを持っています。オブジェクトはリストボックスにバインドされたデータです。 1つのリストはリストのItemsSourceとしてバインドされます。私の問題の原因となるもう一つは、リストのItemTemplateに設定されているDataTemplateの一部であるコンボボックスにバインドする必要があります。基本的に、リストボックスの各項目には、最初のリストの対応する要素と、2番目のリストを含むコンボボックスがあります。言い換えれば、リスト内のすべての項目は、選択肢の同じコンボボックスを持ちます。データバインドされたオブジェクトの「親」で取得していますか?

この問題は、DataTemplateが最初のリストにバインドされたデータであるということから発生します。私はDataTemplateが両方のリストを含むオブジェクトにデータバインドされることを期待していました。それが起こっても、DataContextの「親」に到達するために必要なバインディング構文の種類を知ることはできません。

誰かが正しい方向に向かうことができますか?

ありがとうございます!

+0

この問題を解決するために、すべてのXAMLが必要です。 – Charlie

答えて

2

あなたが正しく理解している場合、ListBoxのDataContextをクラスのインスタンスに設定することができます(私の例では、list.DataContext = myclass;によってコード内で行います)。あなたのリストボックスのItemSourceをクラス内のリスト(つまりItems)とコンボボックスのitemsSourceをクラス内の別のリスト(つまりValues)に追加します。ここで動作しているように私のXAMLです:

<ListBox Name="list" ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding}"/> 
       <ComboBox ItemsSource= 
          "{Binding RelativeSource={RelativeSource FindAncestor, 
                AncestorType={x:Type ListBox}}, 
            Path=DataContext.Values}" 
       /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

とHERESに私はに結合していたクラス:

コードで
public class AClass 
{ 

    protected List<string> _Items; 
    public List<string> Items 
    { 
     get 
     { 
      if (_Items == null) 
      { 
       _Items = new List<string>(); 
      } 
      return _Items; 
     } 
    } 


    protected List<string> _Values; 
    public List<string> Values 
    { 
     get 
     { 
      if (_Values == null) 
      { 
       _Values = new List<string>(); 
      } 
      return _Values; 
     } 
    } 
} 

私は、AClassはのインスタンスを作成した項目と値を追加し、設定しましたインスタンスをリストボックスのDataContextに追加します。

+0

パーフェクト!これはまさに私が達成しようとしていたものです。感謝の印! – djcouchycouch

+0

解決策を見つけようとしていたとき、RelativeSourceを使用することが重要だと気付きましたが、私の考えでは、UI要素階層ではなくDataContext内のメンバーを探したかったのです。あなたのソリューションは、RelativeSourceがUI要素に対してのみ機能し、含まれているデータではないという事実を固めました。再度、感謝します! – djcouchycouch

+0

私はお役に立てます。データ構造に2つの配列があり、もう1つは他の配列を分類するために、同様の状況がコード内にありました。シリアライゼーションのために、それはそのように構造化するのが最も理にかなっていますし、datacontextを使用すると、必要に応じて完全な別のセットをロードできます。 WPFでこれらのことを設定するのはかなりいいですね。 :) –

1

私はあなたがしたいことをやりたいとは思わない。あなたは痛みを求めています。

あなたの代わりにしたいと思うのは、あなたのコンボボックスのサブコレクションを含むコレクション内の各アイテム内の静的コレクションを参照することです。したがって:

//Pseudocode 
TopLevelEntity 
{ 
    SubLevelEntity[] SubItemsForComboBox; 
} 

このように、各「TopLevelEntity」では、コンボボックスのアイテムのコレクションを準備します。

<ListView ItemsSource="{StaticResource MyCollectionOfTopLevelEntities}"> 
    <ItemTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding SubItemsForComboBox} /> 
     </DataTemplate> 
    </ItemTemplate> 
</ListView> 

私の方法ですが、私はこのコードを検証していないし、コンパイルできない可能性もありますが、理論は健全でなければなりません。

あなたのやりたいことをお知らせください。

+0

あなたの提案から理解できるところから、すべてのアイテムにコンボボックスのオプションの重複リストがあるという欠点があります。 – djcouchycouch

+0

技術的には、それらをコレクションの同じインスタンスに等しく設定できますが、ポイントが取られます。 –

0

最初にアンダーソンが提案したように、クラスを再設計して、静的に参照されるリストとして外部からいくつかのコンボボックスアイテムを取得することをお勧めします。 しかし、現在のシナリオの回避策があります。 私はあなたのメインオブジェクト( '親')がListBoxのDataContextであると仮定しています。 DataTemplateLevel内で参照したいと思っていました。リストボックスまで移動してDataContextを取得することです。

<Combobox DataContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" ItemsSource="{Binding YourCollection}" .... 
関連する問題