WPF:将集合绑定到项控件

本文关键字:控件 绑定 集合 WPF | 更新日期: 2023-09-27 18:24:52

iv'e得到了一个由3个类组成的dll,这些类代表一个棋盘游戏:

   Board , Pipe , Checker 

棋盘是管道的集合,管道是棋盘的集合

对手的动作将包括从一个管道中取出一个方格,然后将其放入另一个管道。

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

玩家的移动将通过在项目控件之间拖放来完成

检查器类:

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

需要使用IsMine属性来确定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由一个椭圆组成代表每个检查器)。

到目前为止,iv'e只是填充集合,并将它们设置为每个项目控制的项目源

例如:

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

collection和itemsControl之间双向绑定的任何好例子都将不胜感激。

项目控制:

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

数据模板:

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

WPF:将集合绑定到项控件

与其直接设置ItemsSource,不如创建一个绑定。
Binding b = new Binding();
b.Source = board.Pipes[23];
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b.Path = new PropertyPath("Checkers");
Pipe23.SetBinding(ListBox.ItemsSourceProperty, b);