Silverlight Listbox ItemTemplate Usercontrol Binding

时间:2012-02-11 22:53:54

标签: silverlight data-binding binding listbox dependency-properties

在这里抓我的大脑......

我有以下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);
        }
    }

我要做的是将ListBox的ItemsSource中的当前项传递给我的usercontrol。但是,使用上述方法不起作用,依赖属性的setter永远不会被调用。

我做错了什么?

1 个答案:

答案 0 :(得分: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上的更多代码。您也可以在某个地方上传项目,我可以查看它。