2012-02-16 25 views
0

iv'eは、ボードゲームを表す3つのクラスからなるDLLを得た:WPF:のItemsControlにコレクションを結合

Board , Pipe , Checker 

ボードはパイプのコレクションであり、パイプがチェッカーのコレクションである

相手の動きは、あるパイプからチェッカーを取り出して別のパイプに配置することで構成されます。

私のボードは23項目、コントロールとグリッドパネルで表され、 Iは、プレイヤの動きをすることによって行われることになるUI

上の動きを表示するようにパイプに各項目制御をバインドする必要がありますitemcontrols 間ドロップドラッグ(まだその部分に周りにもらっていない)

チェッカークラス:

public Checker 
    { 
     public bool IsMine{get; set;} 
    } 

IsMineプロパティはチェッカーコルを決定するために使用される必要がありますまたは。

パイプクラス:それは追加のパイプ項目を対応するコレクションが

を変更したときの項目を削除しているもの、私はそれぞれのItemsControlの間の結合を2ウェイを作成されて行う必要があるとチェッカー
public class Pipe : INotifyPropertyChanged 
    { 
    public Pipe() 
    { 
     checkers = new ObservableCollection<Checker>(); 
    } 

    private ObservableCollection<Checker> checkers {get;set;} 
    public ObservableCollection<Checker> Checkers 
    { 
     get { return checkers; } 
     set 
     {        
      checkers = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Checkers")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged;    
} 

ののObservableCollectionを保持しています

また、IsMineプロパティをチェックし、それに応じてオブジェクトを 色に設定するカスタムコンバータが必要です(itemsControl DataItemTemplateは、各チェッカーを とするEllipseで構成されています)。今まで

はiv'eだけのコレクションを移入し、各項目は、制御のための項目ソースとしてそれらを設定

例えば

Pipe23.ItemsSource = board.Pipes[23].Checkers; 

私は2つの課題に直面しています: (1) エーテルは、 のコードのOwnerToColorコンバーターとの双方向バインディングを作成します。これは、これがどのように行われたかの例を見つけることができませんでした。

(2)マークアップでこの結合を作るが、その後どのようにして、例えば、適切なパイプ

で開始アイテム 初期化することができ:

pipe23 starts with 2 checkers 

board.Pipes[23].Checkers.Add(new Checker(true)); 
board.Pipes[23].Checkers.Add(new Checker(true)); 

コレクション間の結合2ウェイのための任意の良い例itemsControlが最も高く評価されます。

のItemsControl:

<ItemsControl Grid.Row="0" Grid.Column="0" Name="Pipe23" ItemTemplate="{StaticResource PipeDataItem}"/> 

のDataTemplate:

 <DataTemplate x:Key="PipeDataItem" > 
      <Ellipse Width="45" Height="45" Fill="{Binding IsMine,Converter={StaticResource MyOwnerToColorConverter}}"></Ellipse> 
    </DataTemplate> 
+0

私は多分私が何の項目を記載していない例外をスローした項目コントロールに楕円を追加しようとしたのItemsControlとコレクション 間の牽引方法バインド を行うことは不可能だと思うし始めていますitemscontrolが使用されている間に追加することができます。 –

答えて

1

代わりに、直接のItemsSourceを設定するには、バインディングを作成する必要があります。

Binding b = new Binding(); 
b.Source = board.Pipes[23]; 
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
b.Path = new PropertyPath("Checkers"); 
Pipe23.SetBinding(ListBox.ItemsSourceProperty, b); 
+0

ありがとう、これは、ソースからコントロールまで、 からどのように動作するように見えますか? 上記の私の質問のdatatemplateを見てください。 ソースコレクション を更新する必要がある場合はどこに楕円を追加するか、目的のテンプレートのオブジェクトを追加する一貫した方法がありますか? –

+0

これはどう違うのですか。 Pipe23.ItemsSource = board.Pipe [23] それも同様に更新されます。 あなたが説明したようにバインディングを指定する唯一の理由は、それを牽引することです。したがって、Pipe23(ItemsControl)に新しい楕円を追加するとChecker オブジェクトがパイプ(チェッカーコレクション)に追加されます。 しかし、ソースでCheckerにするのはどのように分かりますか? これはできますか? –

+0

モデルを修正する必要があり、UIが自動的に更新されます。したがって、ユーザーがマーカーをpipeAからpipeBにドラッグしたときにイベントを処理します。これで、boards.Pipes [A]からチェッカーを削除し、boards.Pipes [B]に追加します。コレクションをバインドしたので、UIを手動で更新する必要はありません。 – SynXsiS

関連する問題