0

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(因此返回类型是 object 而不是 Ship)。这最终会导致 SetValue 出现异常。Ship-properties 上的其他绑定确实有效,所以我真的不知道。根据这个问题,上面应该工作:

WPF 将当前项目从列表传递到用户控件

有关在数据绑定上引发异常的示例项目,请参见此处,因为传递的对象是 Binding 而不是数据对象。http://dl.dropbox.com/u/33603251/TestBindingApp.zip

4

2 回答 2

0

您需要将 ax:Name="MyControl"置于您的控件中,然后您的绑定将看起来像Ship="{Binding ElementName=MyList, Path=CurrentItem}"而不是只是{Binding}(这并不意味着太多 AFAIK)。您的控件需要公开该CurrentItem属性。

如果您不想明确命名您的控件,您可以尝试使用相对源,但我自己没有尝试,因此无法帮助您解决这个问题。

于 2013-03-09T22:46:28.787 回答
0

您的 Dependency Property 格式不正确,因此 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;
}
于 2013-03-10T08:21:24.057 回答