Windows Phone 7.1项目(WP 8.0 SDK),我想将ItemTemplate中的当前项传递给用户控件。
XAML:
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:ShipControl Ship="{Binding}" x:Name="ShipControl"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
ShipControl背后的代码:
public object Ship
{
get
{
return GetValue(ShipProperty);
}
set
{
SetValue(ShipProperty, value);
}
}
//Used by xaml binding
public static readonly DependencyProperty ShipProperty = DependencyProperty.Register("Ship", typeof(Ship), typeof(Ship), new PropertyMetadata(null, new PropertyChangedCallback(OnShipChanged)));
private static void OnShipChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//TODO: Set break point here
return;
}
但是,在调试Ship时,值为DataBinding的对象作为值传递,而不是Ship(因此返回类型是对象而不是Ship)。这最终会导致SetValue出现异常。 Ship-properties上的其他绑定确实有效,所以我真的不知道。根据这个问题,上面应该有效:
WPF Pass current item from list to usercontrol
请参阅此处查看在数据绑定上抛出异常的示例项目,因为传递的对象是Binding而不是数据对象。 http://dl.dropbox.com/u/33603251/TestBindingApp.zip
答案 0 :(得分:0)
您需要在控件中添加x:Name="MyControl"
,然后您的绑定将显示为Ship="{Binding ElementName=MyList, Path=CurrentItem}"
,而不仅仅是{Binding}
(这并不代表AFAIK)。您的控件需要公开CurrentItem
属性。
如果您不想明确命名您的控件,您可以尝试使用Relative Source,但我没有尝试自己,所以无法帮助您。
答案 1 :(得分:0)
您的依赖项属性格式错误,因此XAML解析器不会将其视为此类。
您需要将实例属性类型更改为Ship,并将DependencyProperty所有者类型更改为ShipControl。然后绑定将起作用(假设您绑定到船只列表)。
public Ship Ship
{
get { return (Ship)GetValue(ShipProperty); }
set { SetValue(ShipProperty, value); }
}
public static readonly DependencyProperty ShipProperty =
DependencyProperty.Register("Ship", typeof(Ship), typeof(ShipControl), new PropertyMetadata(null, new PropertyChangedCallback(OnShipChanged)));
private static void OnShipChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//TODO: Set break point here
return;
}