0

まず第一に、私が何をしているのかを説明しようとします。チェス盤を描いてみました。セルのユーザーコントロールがあります

<Grid x:Name="LayoutRoot">
        <Border BorderThickness="0" Margin="0" Background="{Binding CellColor, ElementName=userControl, Mode=TwoWay}"/>
        <Border x:Name="ValidMoveMarker" BorderThickness="0" Margin="0" Background="#FFC1CAB4" Opacity="0"/>
        <Image x:Name="img" Source="{Binding source, ElementName=userControl, Mode=TwoWay}" Cursor="Hand"/>

この CellControl の背後にあるコードには、2 つの dpProperties があります

    public eColor? PieceColor
    {
        get { return (eColor?)GetValue(PieceColorProperty); }
        set { SetValue(PieceColorProperty, value);}
    }
    public static readonly DependencyProperty PieceColorProperty = DependencyProperty.Register("PieceColor", typeof(eColor?), typeof(CellControl), null);


    public eType? PieceType
    {
        get { return (eType?)GetValue(PieceTypeProperty); }
        set { SetValue(PieceTypeProperty, value);}
    }
    public static readonly DependencyProperty PieceTypeProperty = DependencyProperty.Register("PieceType", typeof(eType?), typeof(CellControl), null);

ここで、eColor と eType は列挙子です。ここにも1つのプロパティがあります

public ImageSource source
        {
            get
            {
                if (PieceColor == eColor.White)
                {
                    switch (PieceType)
                    {
                        case eType.Pawn:
                            return new BitmapImage(new Uri("/PO.PC;component/Images/chess_piece_white_pawn_T.png", UriKind.Relative));
                        case eType.Knight:
                            return new BitmapImage(new Uri("/PO.PC;component/Images/chess_piece_white_knight_T.png", UriKind.Relative));
                                    ...
                        default:
                            return null;
                    }
                }
                else
                {
                    switch (PieceType)
                    {
                        case eType.Pawn:
                    }
                }
            }

今問題は、このようなコントロールを使用しようとするときです

<PP_Controls:CellControl PieceType="{Binding type, Mode=TwoWay}"  PieceColor="{Binding color, Mode=TwoWay}"

どこ

    private eColor? _color;
    public eColor? color
    {
        get { return _color; }
        set
        {
            _color = value;
            OnPropertyChanged("color");
        }
    }

    private eType? _type;
    public eType? type
    {
        get { return _type; }
        set
        {
            _type = value;
            OnPropertyChanged("type");
        }
    }

何も起こりません。しかし、このようなコントロールを使用すると

<PP_Controls:CellControl PieceType="Bishop"  PieceColor="Black"

それは完全に機能しています。バインディングに何か足りないものはありますか? これは、「ソース」プロパティが依存プロパティ自体ではないためですか? 問題を回避するにはどうすればよいですか?

4

1 に答える 1

0

ターゲット プロパティは依存関係プロパティであり、ソース プロパティは を実装する CLR プロパティINotifyPropertyChangedであるため、バインディング{Binding type}などが機能するはずです。「バインディングで使用する」が色/タイプ プロパティを持つタイプであると仮定します。DataContextこれらのバインディングが失敗しているかどうかは、デバッガーでアプリケーションを実行するときに [出力] ウィンドウを確認することで判断できるはずです (Silverlight 5 では、バインディング ブレークポイントを使用することもできます。そうでない場合はValueConverter、バインドに簡単なものを適用して、デバッグ用のブレークポイント)。

ただし、コントロールのsourceプロパティは、「怠惰な」方法で他の 2 つのプロパティに依存しています。プロパティにバインドしていsourceますが、プロパティの計算値が変更されたときに、このバインディングが更新されることはありません。依存関係プロパティの変更されたハンドラーをPieceColorおよびPieceTypewhich に追加する必要がありますOnPropertyChanged("source")(または、同等に DP または通知プロパティに変換し、値を明示的に再計算します)。

于 2013-03-11T12:44:39.560 に答える