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 ではなく値として渡されます (したがって、戻り値の型は Ship ではなくオブジェクトになります)。これにより、最終的に SetValue で例外が発生します。船のプロパティの他のバインディングは機能するので、私にはまったくわかりません。この質問によると、上記はうまくいくはずです:

WPFリストからユーザーコントロールに現在のアイテムを渡す

渡されたオブジェクトがデータ オブジェクトではなく Binding であるため、データ バインディングで例外をスローするサンプル プロジェクトについては、こちらを参照してください。http://dl.dropbox.com/u/33603251/TestBindingApp.zip

4

2 に答える 2

0

依存関係プロパティの形式が正しくないため、XAML パーサーはそれをそのように処理しません。

インスタンス プロパティ タイプを Ship に変更し、DependencyProperty 所有者タイプを ShipControl に変更する必要があります。次に、Binding が機能します (Ship のリストにバインドしていると仮定します)。

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 に答える
0

x:Name="MyControl"コントロールに a を配置する必要があります。そうすれば、バインディングはShip="{Binding ElementName=MyList, Path=CurrentItem}"単なるものではなく次のようになります{Binding}(これはあまり意味がありません)。コントロールはCurrentItemプロパティを公開する必要があります。

コントロールに明示的に名前を付けたくない場合は、相対ソースで試すことができますが、私は自分で試していないので、これについてはお手伝いできません。

于 2013-03-09T22:46:28.787 に答える