2017-03-21 17 views
3

私の以前の混乱のため申し訳ありません。ItemsSourceプロパティの割り当て方法

状況はこれです: は、私は次のように定義された2つのカスタムオブジェクトを持っている: MainObject:

public class MainObject 
{ 
    private string mainObjectName; 
    public string MainObjectName { get { return mainObjectName; } } 

    private List<SubObject> subObjectData; 
    public List<SubObject> SubObjectData { get { return subObjectData; } } 

    public MainObject(string name, List<SubObject> objectData) 
    { 
     mainObjectName = name; 
     subObjectData = objectData; 
    } 
} 

サブオブジェクト:

public class SubObject 
{ 
    private string subObjectName; 
    public string SubObjectName { get { return subObjectName; } } 

    private List<int> integerData; 
    public List<int> IntegerData { get { return integerData; } } 

    public SubObject(string name, List<int> data) 
    { 
     subObjectName = name; 
     integerData = data; 
    } 
} 

私も簡単にするために使用していくつかのデータを定義するのviewmodelを持っていますこれら2つのオブジェクトは次のようになります。VM

public List<Model.MainObject> VMList = new List<Model.MainObject>() 
    { 
     new Model.MainObject("MainItem1", new List<Model.SubObject>() 
     { 
      new Model.SubObject("SubItem1", new List<int>() { 1,6,3}), 
      new Model.SubObject("SubItem2", new List<int>() { 5,2,9}) 
     }), 
     new Model.MainObject("MainItem2", new List<Model.SubObject>() 
     { 
      new Model.SubObject("SubItem1", new List<int>() { 0,3,1}), 
      new Model.SubObject("SubItem2", new List<int>() { 7,5,2}) 
     }) 
    }; 
ViewModel.VM dc = new ViewModel.VM(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = dc; 
     MainObjectIC.ItemsSource = dc.VMList; 
    } 

私もSubObjectICへのItemsSourceを割り当てることが、私ということをしたい:は今、私はそうのような背後にあるコードでMainObjectICののItemsSourceを割り当て、次のUI

<Grid> 
    <ItemsControl Name="MainObjectIC"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition/> 
         <ColumnDefinition/> 
        </Grid.ColumnDefinitions> 
        <TextBlock Text="{Binding MainObjectName}"/> 
        <ItemsControl Name="SubObjectIC"> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding SubObjectName}"/> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Grid> 

を持っていますそのItemsControlオブジェクトを取得する必要があります。そしてこれが私が達成しようとしていることです。

私が理解したところでは、コードソースからItemsSourceプロパティを割り当てることは非常に悪く無駄かもしれません。

+0

"子"コレクションのバインディングの相対ソースが機能するはずです。私は祖先のタイプのウィンドウを見つけるためにこれを行っただけですが、もっと多くのタイプが可能になると思います。 –

+0

マークアップ全体に '{Binding ...}'バインディングがあります。 'RelicItemsSource'のItemsSourceをなぜxamlにバインドできないのですか? – ASh

+0

はい、RelicItemsSourceはComponentsItemsSourceにバインドされたオブジェクトに依存する必要があるので、私はそれを行う方法を手がかりにしていません。また、私は私の欲しいオブジェクトの代わりに 'this'にDataContextをバインドする必要があると思います。 –

答えて

2

コード例を改善していただきありがとうございます。まだ完全ではありませんでしたが、答えを出すには十分に近いです。

あなたの例では、欠けている主なものは、単に必要な{Binding}の式を追加することです。特に:

<ItemsControl Name="SubObjectIC" Grid.Column="1" 
       ItemsSource="{Binding SubObjectData}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding SubObjectName}"/> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

項目のコンテキストがすでに(なぜあなたTextBlock結合作品である)タイプMainObjectの目的です。したがって、完了する必要があるのは、ItemsSourceプロパティをMainObject.SubObjectDataプロパティにバインドすることです。

(私は上記のあなたの例から欠落しているように見えGrid.Column割り当てを、追加する必要がありました。)

を上記の変更は、あなたが望むように動作するあなたの例を得るために完全に十分です。ただし、最上位レベルのコントロールにも同じ基本的なアプローチを使用して、コードを改善することができます。

class VM 
{ 
    public List<MainObject> VMList { get { return _vmList; } } 

    private readonly List<MainObject> _vmList = new List<MainObject>() 
    { 
     new MainObject("MainItem1", new List<SubObject>() 
     { 
      new SubObject("SubItem1", new List<int>() { 1,6,3}), 
      new SubObject("SubItem2", new List<int>() { 5,2,9}) 
     }), 
     new MainObject("MainItem2", new List<SubObject>() 
     { 
      new SubObject("SubItem1", new List<int>() { 0,3,1}), 
      new SubObject("SubItem2", new List<int>() { 7,5,2}) 
     }) 
    }; 
} 

その後、あなたは自分のコンストラクタでの明示的代入削除することができます:

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = dc; 
} 
をそうするために、あなたの VM.VMListフィールドがプロパティに変更する必要があります(WPFは、プロパティだけでなく、フィールドに結合します)これらの変更により

、あなたのXAMLは、もはやコントロール名のいずれかを与える必要がない、とあなたは、関連するプロパティに直接結合することができます。

<Window x:Class="TestSO42929995WpfNestedData.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TestSO42929995WpfNestedData" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
    <ItemsControl ItemsSource="{Binding VMList}"> 
     <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition/> 
       <ColumnDefinition/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding MainObjectName}"/> 
      <ItemsControl Grid.Column="1" 
          ItemsSource="{Binding SubObjectData}"> 
       <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding SubObjectName}"/> 
       </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
      </Grid> 
     </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
    </Grid> 
</Window> 

キーポイ上記で明白ではない可能性があるのは、すべてのコントロールにDataContextがあることです。 {Binding}構文を使用すると、デフォルトでプロパティパスはそのコンテキストに相対的です。トップレベルのコントロールでは、コンテキストはコンストラクターに設定されます。しかし、個々のリストアイテムテンプレートでは、コンテキストはそのリストアイテムの個々のデータオブジェクトです。ケースではMainObjectオブジェクトです。したがって、そのコンテキストでは、MainObjectNameにバインドするのと同じように、SubObjectDataプロパティにバインドするだけです。それはまったく同じ、そして同じ理由で機能します。

+0

ああ、神は私を殺してください、私はそんなにばかです。時間を無駄にしてくれてありがとう –

+0

@ジョージ:あなた自身がとても大変なことは必要ありません。あなたが本当にばかだと、あなたはオリジナルの投稿とそれを改善する方法についてのフィードバックを受け入れることはできませんでした(スタックオーバーフローにはたくさんの人がいると思います)。スタックオーバーフローに関する疑問があるとは思うが、私は検索したが、あなたのものと全く同じものは見つけられなかった。そして、たとえあったとしても、質問と答えの両方を説明するための良い、簡単なコード例があります。ほとんど時間の無駄だとは思われません。 :) –

+0

サポートと大きな態度をありがとう:) –

関連する問題