在这里抓我的大脑......
我有以下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永远不会被调用。
我做错了什么?
答案 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
上的更多代码。您也可以在某个地方上传项目,我可以查看它。