绑定到ItemsControl中的当前项(WP7.1 / 8.0 / Silverlight)

时间:2013-03-09 20:38:25

标签: silverlight windows-phone-7 windows-phone-8

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

2 个答案:

答案 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;
}