WPF:将集合绑定到itemscontrol

时间:2012-02-16 03:21:40

标签: c# wpf data-binding collections

我有一个由3个类组成的dll代表棋盘游戏:

   Board , Pipe , Checker 

董事会是一系列管道,管道是一系列检查员

对手运动将包括从一个管道中移除一个检查器并将其放在另一个管道中。

我的电路板由一个带有23项控件的网格面板代表, 我需要将每个项目控件绑定到管道,以便在UI上显示移动

玩家移动将通过项目控制之间的拖放来完成 (尚未到达那个部分)

Checker Class:

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

需要使用IsMine属性来确定Checkers Color。

Pipe Class:持有一个ObservableCollection of checkers

  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;            
 }

我需要做的是在每个itemscontrol和它的相应管道项之间创建一个双向绑定,当集合发生变化时添加和删除项目

我还需要一个自定义转换器来检查IsMine属性并设置对象 相应的颜色(itemsControl DataItemTemplate由一个Ellipse组成 代表每个检查员。)

直到现在,我只是填充集合并将它们设置为每个项目控件的项目源

例如:

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

我面临两个挑战: (1) ether在后面的代码中创建一个与OwnerToColor转换器的双向绑定     我无法找到这样做的例子。

(2)在标记中创建此绑定,但是如何初始化起始项     在适当的管道

例如:

pipe23 starts with 2 checkers 

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

对于集合和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>

1 个答案:

答案 0 :(得分: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);