2017-11-13 9 views
0

私が探しているユースケースは非常に具体的であり、十分に文書化されていないため、WPFの依存関係プロパティを頭に浮かべるのが難しいです。私が持っているものWPF依存関係プロパティ

は(!すべてのひどいコードを無視行ってください、それは一時的なものである)このようになりますカスタムコントロールです:

<UserControl x:Class="HydroAccessory.Controls.FillGraph" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:HydroAccessory.Controls" 
     mc:Ignorable="d" 
     SizeChanged="FillGraph_SizeChanged" 
     d:DesignHeight="200" d:DesignWidth="300"> 
<Grid> 

    <TextBlock x:Name="PercentageTB" Text="Fill Percentage: 0%" /> 

</Grid> 

私はこのような私のメインウィンドウ内で呼び出します:

<controls:FillGraph x:Name="HydroModel" /> 

とコントロール内のコードは次の通りである:

using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace HydroAccessory.Controls 
{ 
public partial class FillGraph : UserControl 
{ 
    private float percentage; 
    public float Percentage 
    { 
     get 
     { 
      return percentage; 
     } 
     set 
     { 
      percentage = value; 
      PercentageTB.Text = String.Format("Fill Percentage: {0}", percentage.ToString() + "%"); 
     } 
    } 

    public FillGraph() 
    { 
     InitializeComponent(); 
    } 
} 
} 
0私が行うことができるようにしたい

すべては、メインウィンドウの私のカスタムコントロールの呼び出しで言うです:

<controls:FillGraph x:Name="HydroModel" Percentage="{Binding FillPercentage}" /> 

(FillPercentageはあなたが心配する必要はありません別のスクリプトで何かされています)。 コントロールが拡張されるため、カスタムコントロールとして使用する必要があります。 私は依存関係のプロパティが必要かもしれないことを理解していますが、多くの異なる方法を試した後、私はこの一見単純な作業を行う方法を理解できません。ヘルプは高く評価されます。

+0

あなたが実際に依存関係プロパティを作成する必要があります。

<TextBlock Text="{Binding Percentage, StringFormat='Fill Percentage: {0:p2}', RelativeSource={RelativeSource AncestorType=UserControl}}" /> 

あなたの質問からこのXAMLはのviewmodelはFillPercentage性を有し、正しくINotifyPropertyChangedを実装することを想定し、それは同じようで結構です。あなたは何を理解していますか? – SLaks

+0

'Percentage'は現在通常のプロパティです。単にそれを[依存プロパティ](https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/dependency-properties-overview)にしてください。 – Sinatr

+1

propdpスニペットが役に立ちます –

答えて

3

コードに依存プロパティはありません。

これは、依存関係プロパティです:

public partial class FillGraph : UserControl 
{ 
    public FillGraph() 
    { 
     InitializeComponent(); 
    } 

    public float Percentage 
    { 
     get { return (float)GetValue(PercentageProperty); } 
     set { SetValue(PercentageProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Percentage. This 
    // enables animation, styling, binding, etc... 
    public static readonly DependencyProperty PercentageProperty = 
     DependencyProperty.Register("Percentage", typeof(float), 
       typeof(FillGraph), new PropertyMetadata(0.0f)); 
} 

Ayyappanサブラマニアンが示唆するように、Visual Studioでpropdpスニペットは、定型を作成するのに役立ちます。 DependencyProperty.Register()に渡すパラメータに注意して、new PropertyMetadata()に渡すデフォルト値が正しいタイプであることを確認してください。 0.0fはフロートです。 floatプロパティに整数0を渡すと、実行時に例外がスローされます。

通常のプロパティpublic float Percentageはオプションです。あなたのコードを使用するだけです。 XAMLはまったくそれに触れません(あなたが私を疑うなら、ゲッターとセッターにブレークポイントを入れてください)。これは依存関係プロパティの特別な部分の一部です。

そして、あなたのusercontrol XAMLでそれを使用する方法です。バインディングのパラメータはStringFormatであることに注意してください。

<Grid> 
    <TextBlock 
     Text="{Binding Percentage, RelativeSource={RelativeSource AncestorType=UserControl}, StringFormat='Fill Percentage: {0:#.##}%'}" 
     /> 
</Grid> 

注:割合は100に1ではなく0の範囲0で発現さ場合、代わりp%形式を使用します。小数点以下2桁にはp2を使用します。フォーマット文字列はそれを提供するので、%は省略します。

<controls:FillGraph x:Name="HydroModel" Percentage="{Binding FillPercentage}" /> 
+0

答えをくれてありがとう - さまざまなことが起こっていました.1つはプロパティのメタデータをフロートではなく、スクリプト内のテキストブロック(スクリプトが動作したにもかかわらず複雑なもの)。投稿された回答は本当に私のために働いた - ありがとう! – AidanH

+0

複雑なものは何ですか? –

+0

それを心配する必要はなく、読みやすさのためにいくつかのコードを切り出し、いくつかの問題を引き起こしました。 – AidanH

関連する問題