マークアップと分離コード
マークアップでは、色の名前を表示するリスト項目 ListBox のほかに、色の名前と色成分を表示するリスト項目 listView と、その色を表示するキャンバス Canvas を用意します。
<!-- exBridgeList.xaml --><GridViewColumn Header="Color Name" DisplayMemberBinding="{Binding Path=name}" ... /> <GridViewColumn Header="Red" DisplayMemberBinding="{Binding Path=red}" ... /> <GridViewColumn Header="Green" DisplayMemberBinding="{Binding Path=green}" ... /> <GridViewColumn Header="Blue" DisplayMemberBinding="{Binding Path=blue}" ... />
マークアップで記述した各コントロール ListBox/Canvas/ListView を、分離コードで参照するときには(プロパティー Name= に続く文字列と同じ名前の)インスタンス属性 listBox/colorBox/listView を利用できます。
コントロール GridViewColumn のプロパティー DisplayMemberBinding= に、データバインディングを適用します。すると、self.view.ItemsSource を介して、結合するデータオブジェクト ColorItem のインスタンス属性 name/red/green/blue が、リスト項目に反映されます。
class ExWindow(Window): def init(self): target = "listBox", "listView", "colorBox" self._Controls(target) for view in [ ItemList(self.listBox , self), GridList(self.listView, self), ]: ColorList(view).addItems(self.colorBrushes()) def paint(self, color): self.colorBox.Background = color
self.listBox は、ItemList に取り込まれることで、ListImplementor で規定したプロトコルに従うようになります。self.listView/GridList についても同様です。すると、どのようなコントロールを使って実現するか(how)に依らず、統一したアクセス(what)が可能になります。第2引数に self を指定するのは、必要なら自身 self への逆アクセスを可能にするためです。
さらに、ItemList/GridList は、ColorList に取り込まれることで、ListAbstraction で規定したプロトコルに従うようになります。すると、規定されたメソッド addItems を使って、複数のリスト項目 items を追加できます。