1

バインディング....SilverlightのリストボックスItemTemplateにユーザーコントロールは、ここに私の脳を傷つけ

私は、次のListBox

<ListBox Height="221" HorizontalAlignment="Left" Name="listBox1" VerticalAlignment="Top" Width="Auto" ItemsSource="{Binding MediaItems}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid ShowGridLines="True"> 
        <my:MediaItemControl CurrentItem="{Binding}" /> 

       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ListBox> 

がリストボックスは、オブジェクトののObservableCollectionにバインドされています。

このように、このListBoxにはユーザーコントロールが含まれています。ユーザーコントロール内には、以下の依存関係プロパティ情報があります。私がやろうとしています何

public static readonly DependencyProperty CurrentItemProperty = DependencyProperty.Register("CurrentItem", typeof(TypedMediaItem), typeof(MediaItemControl), new PropertyMetadata(null)); 
    public TypedMediaItem CurrentItem 
    { 
     get { return (TypedMediaItem)GetValue(MediaItemControl.CurrentItemProperty); } 
     set { 
      SetValue(MediaItemControl.CurrentItemProperty, value); 
     } 
    } 

は私のユーザーコントロールに、リストボックスののItemsSource内の現在のアイテムを渡すことです。しかし、上記のメソッドを使用すると、依存関係プロパティのセッターが呼び出されることはありません。

私は間違っていますか?

+0

'MediaItems'は' ObservableCollection 'です。あなたは' IemsSource'バインディングがコレクションに正しくバインドされていると確信しています。これは正しいです?また、依存関係プロパティのセッターが呼び出されないことをどのように知っていますか?(具体的に) –

+0

はいMediaItemsはObservableCollection であり、IemsSourceバインディングがコレクションに正しくバインドされていると確信しています。ラベルは、TypedMediaItemオブジェクトのメンバーに直接バインドできます。私は決してそれではないプロパティの設定メソッドにブレークポイントを設定するので、セッターは決して呼び出されないことを知っています。 –

答えて

3

DependencyPropertyにバインドするものは、作成したCLRプロパティを直接呼び出すことはありません。 DependencyPropertyが変更されたかどうかを実際に知るには、次のようにPropertyChangedCallbackを作成する必要があります。

//Never used by xaml that binds to CurrentItem 
//Only used when referenced directly by C# code 
//Example: (obj as MediaItemControl).CurrentItem = new TypedMediaItem(); 
public TypedMediaItem CurrentItem{ 
    get { return (TypedMediaItem) GetValue(CurrentItemProperty); } 
    set { SetValue(CurrentItemProperty , value); } 
} 

//Used by xaml binding 
public static readonly DependencyProperty CurrentItemProperty = 
    DependencyProperty.Register("CurrentItem", typeof(TypedMediaItem), 
    typeof(MediaItemControl), new PropertyMetadata(null, new PropertyChangedCallback(OnCurrentItemChanged))); 

private static void OnCurrentItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
    //TODO: Set break point here 
    //If this code is executed, then the property was changed 
    MediaItemControl instance = (MediaItemControl) d; 
    TypedMediaItem newValue = (TypedMediaItem) e.NewValue; 
    return; 
} 

これはあなたの質問に正確には答えませんが、少し遠くまでデバッグするのに役立ちます。 何が間違っているのか分からない場合は、あなたが提供したものがすべて正しいと思われるので、私はより多くの情報に行きます。たとえば、取得しているエラー、またはMediaItemControlのコードがあります。プロジェクトをどこかにアップロードして、それを見ることもできます。

+0

ブライアンに感謝して、私の質問に答え、私に不眠の夜を救った。私はCLRプロパティが呼び出されないことに気付かなかった。多くのありがとう –

+0

ブライアン、1つの質問。 OnCurrentItemChangedメソッドは静的として宣言されているので、依存関係プロパティを介して渡されたオブジェクトに基づいて、それを使用してusercontrolでミニレベルを実行するにはどうすればよいですか?私の意味ははっきりしているといい。 –

+0

問題はありませんが、私はあなたに役立つ何かで 'OnCurrentItemChanged'の中で私の答えを更新しました。そうでない場合は教えてください。 –

関連する問題