none
List化したボタンから別のリストへデータをバインドする方法 RRS feed

  • 質問

  • お世話になります。

    データバインドについてわからないことがあるので質問させてください。

     

    以下のxamlで、xmlからリスト化されたボタンを作りました。

     

    <StackPanel x:Name="CategoryPanel" >
     <StackPanel.Resources>
      <XmlDataProvider x:Key="Category">
       <x:XData>
        <category xmlns="">
         <items name="A">
          <item name="A1" />
          <item name="A2" />
          <item name="A3" />
         </items>
         <items name="B">
          <item name="B1" />
          <item name="B2" />
         </items>
         <items name="C">
          <item name="C1" />
          <item name="C2" />
          <item name="C3" />
          <item name="C4" />
         </items>
        </category>
       </x:XData>
      </XmlDataProvider>
     </StackPanel.Resources>
    
     <ListBox ItemsSource="{Binding Source={StaticResource Category}, XPath=/category/items}">
      <ListBox.ItemTemplate>
       <DataTemplate>
        <Button Content="{Binding XPath=@name}"/>
       </DataTemplate>
      </ListBox.ItemTemplate>
     </ListBox>
    </StackPanel>
    

     

     

    ↓このような感じでフォーム上に表示されます。

     

    [ A ]    |

    [ B ]    |

    [ C ]    |


     

     

    このコードにより、生成されたボタンをクリックし、別のリストボックスにボタンの子要素をバインドする方法がわかりません。例として、Cボタンをクリックした場合、以下のリストが得られるようにしたいです。

    [ A ]    |     [C1]

    [ B ]    |     [C2]

    [ C ]    |     [C3]

               |     [C4]

    できれば、すべての処理をxamlで記述したいと考えています。実装方法をご教授願います。

    具体的には、リスト化したボタンから選択したxmlの子要素を別のリストへ渡す方法と受け取る側のListBoxの処理の記述で苦戦しています。

    • 編集済み I.TMK 2010年10月21日 13:44 内容誤り修正
    2010年10月21日 13:43

回答

  • 全てXAMLで出来ましたが、どちらかというとXAMLだけでButton.Click時にListBoxの項目を選択状態にする方が問題です。

    そのため今回はBlend SDKを使いました。 Blend SDKはExpression Blendがインストールされていない状態でもインストールが可能で、Blendの機能拡張ではなく、独自トリガー・独自トリガーアクション・独自ビヘイビアの実装を容易にするものです。

    同等の実装を.NET Frameworkだけで行うためにはボタンに対する添付ビヘイビアの実装が必要となるでしょう。

    <StackPanel x:Name="CategoryPanel" >
    	<StackPanel.Resources>
    		
    		<XmlDataProvider x:Key="Category">
    			<x:XData>
    			  <category xmlns="">
    			   <items name="A">
    			   <item name="A1" />
    			   <item name="A2" />
    			   <item name="A3" />
    			   </items>
    			   <items name="B">
    			   <item name="B1" />
    			   <item name="B2" />
    			   </items>
    			   <items name="C">
    			   <item name="C1" />
    			   <item name="C2" />
    			   <item name="C3" />
    			   <item name="C4" />
    			   </items>
    			  </category>
    			  </x:XData>
    			</XmlDataProvider>
    	</StackPanel.Resources>
    
    	<ListBox x:Name="listBox" ItemsSource="{Binding Source={StaticResource Category}, XPath=/category/items}">
        <ListBox.ItemContainerStyle>
          <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Template">
              <Setter.Value>
                <ControlTemplate x:Name="test" TargetType="{x:Type ListBoxItem}">
                	<Button >
                		<i:Interaction.Triggers>
                			<i:EventTrigger EventName="Click">
                				<ei:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource TemplatedParent}}" PropertyName="IsSelected" Value="True" />
                			</i:EventTrigger>
                		</i:Interaction.Triggers>
                		<ContentPresenter/>
    							</Button>
                </ControlTemplate>
              </Setter.Value>
            </Setter>
          </Style>
        </ListBox.ItemContainerStyle>
    		<ListBox.ItemTemplate>
    			<DataTemplate>
    				<TextBlock Text="{Binding XPath=@name}"/>
    			</DataTemplate>
    		</ListBox.ItemTemplate>
        </ListBox>
    	
    	<ListBox ItemsSource="{Binding SelectedItem, ElementName=listBox}">
    		<ListBox.ItemTemplate>
    			<DataTemplate>
    				<TextBlock Text="{Binding XPath=@name}"/>
    			</DataTemplate>
    		</ListBox.ItemTemplate>
    	</ListBox>
    </StackPanel>
    

    • 回答としてマーク I.TMK 2010年10月25日 3:49
    2010年10月23日 2:30