1

他の要素の中に ProgressBar を含む customcontrol があります。

<ProgressBar Value="{TemplateBinding CurrentProgress}"
             MinValue="{TemplateBinding MinValue}"
             MaxValue="{TemplateBinding MaxValue}"/>

<Label Content="{TemplateBinding CurrentProgress}"/>

私の .cs ファイルでは、これらすべてのプロパティを次のように定義しました。

#region MaxProgress
public int MaxProgress
{
    get { return (int)GetValue(MaxProgressProperty); }
    set { SetValue(MaxProgressProperty, value); }
}

public static readonly DependencyProperty MaxProgressProperty =
        DependencyProperty.Register("MaxProgress", typeof(int), typeof(GameFlowControl), new FrameworkPropertyMetadata(1000, FrameworkPropertyMetadataOptions.AffectsRender)); 
#endregion

#region CurrentProgress
public int CurrentProgress
{
    get { return (int)GetValue(CurrentProgressProperty); }
    set { SetValue(CurrentProgressProperty, value); }
}

public static readonly DependencyProperty CurrentProgressProperty =
    DependencyProperty.Register("CurrentProgress", typeof(int), typeof(GameFlowControl), new FrameworkPropertyMetadata(50, FrameworkPropertyMetadataOptions.AffectsRender)); 
#endregion

#region MinProgress
public int MinProgress
{
    get { return (int)GetValue(MinProgressProperty); }
    set { SetValue(MinProgressProperty, value); }
}

public static readonly DependencyProperty MinProgressProperty =
    DependencyProperty.Register("MinProgress", typeof(int), typeof(GameFlowControl), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.AffectsRender));
#endregion

上記のようにこれらの値をラベルにバインドするとうまくいきますが、どうやらこれらのバインドは私の ProgressBar では機能しません。私がこれまでに試したこと:

  • Value、MinValue、および MaxValue の順序の変更。
  • TemplateBinding ( CurrentProgress XYZなど) にタイプミスを追加すると、コンパイル エラーが発生します (プロパティが認識されるようになります)。
  • プロパティにデフォルト値を追加しました (0、50、1000 を参照)。
  • バインディングと設定の値を直接削除しました: Value = 50、MinValue = 0、MaxValue=100 は、ProgressBar が半分塗りつぶされて表示されることを示します。
  • これらのプロパティのゲッターにブレークポイントを追加しましたが、それらはトリガーされませんでした(これは私を大いに混乱させます!)

これを引き起こす可能性のあるヒントはありますか?

4

1 に答える 1

2

あなたの質問に基づいて答えます

この状況で使用するバインディング メソッドはValue="{Binding CurrentProgress, RelativeSource={RelativeSource AncestorType={x:Type GameFlowControl}}}". これはビジュアル ツリーを上方向に走査して最初のGameFlowControlコントロールを見つけ、この相対位置からパスにバインドします。

代替案

他の目的で を使用しない場合は、より短いバインディング方法を使用できDataContextます。UserControl

DataContextまず、次のようなものを使用して、派生UserControl参照に を割り当てる必要があります。

    public GasFlowControl()
    {
        InitializeComponent();

        DataContext = this;  //Set the DataContext to point to the control itself

    }

次に、バインディングを次のように単純化できます。

    <ProgressBar Value="{Binding CurrentProgress}"
         MinValue="{Binding MinValue}"
         MaxValue="{Binding MaxValue}"/>

    <Label Content="{Binding CurrentProgress}"/>

あなたの混乱に答えるために

これらのプロパティのゲッターにブレークポイントを追加しましたが、それらはトリガーされませんでした (これは私を大いに混乱させます!)

プロパティの Getter と Setter に対してトリガーされるブレークポイントが得られなかった理由は、WPF フレームワークがそれらを使用しないためです。内部GetValue(CurrentProgressProperty);SetValue(CurrentProgressProperty, value);直接呼び出します。それらは、コードに含めるのに便利なだけであり、型キャストの利便性を備えているため、コンパイル時に型をチェックします。

コードでそれらを使用しない場合、それらはまったく呼び出されません。

于 2016-01-15T10:58:55.927 に答える