2008-09-12 8 views
1

リストボックス内の選択したアイテムのItemContanerを取得する方法はありますか? Silverlight 2.0 Beta 1では、コンテナはSilverlight 2.0のBeta 2に隠されています。データバインディング時にリストボックスのItemContainerを取得する

特定のサイズに選択されていない場合や可変サイズに選択されている場合は、リストボックスアイテムのサイズを変更しようとしています。私はまた、アニメーションのための選択された項目の相対的な位置を取得したい。可変サイズに成長し、相対的なpasitionを得るのはなぜ私がリストボックスの項目に到達する必要があります。

私はリストボックスに明示的にアイテムを追加していないことを明確にする必要があります。私はxamlとDataTemplatesでデータバインディングを使用しています。私がアクセスするのに問題があるのは、選択したアイテムのDataTemplateのItemContainerです。

+0

あなたはリフレクションを使ってそれを行うことができますが、もしそれらが隠れているとすれば、それを直接変更するとリストボックスの状態が崩れてしまうかもしれません。 MSコントロールは退屈ですが、非常に信頼性があります。彼らの保護されたメンバーとプライベートメンバーを混乱させると、それらが不安定になる可能性があります。それは良い考えではありません。あなたが何をしているのかを記述すれば、それについてもっと良い方法があるかもしれません... – Will

答えて

0

UI以外の要素をリストボックスに追加する場合(文字列やUI以外のデータオブジェクトなど)、これはおそらくかなり難しいでしょう。しかし、リストボックスにアイテムを追加する前に、何らかの種類のFrameworkElement派生オブジェクトでアイテムをラップする場合、TransformToVisualを使用して相対サイズを取得し、高さと幅を使用してアイテムのサイズを設定できます。

通常、オブジェクトは次のようにContentControlでラップできます。代わりに:あなたはContentControlににキャストしてサイズを設定し、相対的な位置を取得することができます_ListBox.SelectedItem得るとき今

_ListBox.Items.Add(new ContentControl { Content = obj0 }); 
_ListBox.Items.Add(new ContentControl { Content = obj1 }); 

_ListBox.Items.Add(obj0); 
_ListBox.Items.Add(obj1); 

これを行います。元のオブジェクトが必要な場合は、アイテムのContentプロパティの値を取得するだけです。

2

アイテムのUIElementとアイテムのUIElementsへのマッピングを含むPanelを取得する方法があります。あなたは、リストボックスから継承しなければならない(これは実際には任意のItemsControlにのために働く)とPrepareContainerForItemOverrideを上書き:

protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     base.PrepareContainerForItemOverride(element, item); 
     var el = element as FrameworkElement; 
     if (el != null) 
     { 
      // here is the elements's panel: 
      _itemsHost = el.Parent as Panel; 

      // item is original item inserted in Items or ItemsSource 
      // we can save the mapping between items and FrameworElements: 
      _elementMapping[item] = el; 
     } 
    } 

これは一種のハックですが、それだけで正常に動作します。

0

相対バインディングを使用して、ItemTemplateのItem Containerで取得できるようです。

<TextBlock YourTargetProperty="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBoxItem}}, Mode=OneWay, Path=YourSourceProperty}" /> 

私は、このソリューションhereを見つけました。 Silverlightの5用

0

更新

   <ListBox ItemsSource="{Binding Properties}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" /> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 

RelativeSource AncestorTypeは今、これははるかに簡単になって、サポートされています。

関連する問題