2011-12-26 6 views
5

私が正しくデータを渡すためにどのような制御を書かれており、追加の初期化パラメータを渡そうとしたが、エラー=((TYPEはAjustcontrolが名前attributを持つことができませんでしたが)存在している これはC#で私のコードです:?wpfコントロールコンストラクタのパラメータを渡す方法は?

public AjustControl(BaoC input) 
     { 
      InitializeComponent(); 

      populateAdjustControl(input); 

     } 

エラー:エラー15型 'AjustControl'にはName属性を使用できません。デフォルトコンストラクタのない値の型と型は、ResourceDictionary内の項目として使用できます。Line 470 Position 26. D:\ Prj \ aaa \ MainWindow。 xaml 470 26 Studio

+0

元のエラーをコピーして、IDE上で再入力するのではなく、IDEからコピーしてください。いくつかのタイプミスがあるようです。 –

+0

私はあなたの質問に応じて私の質問を更新しました –

+0

多くのコードを見ることなく決定を下すのは難しいです。あなたがミスタイプしていることが起こるかもしれませんが、何かを作るのは難しいです。 –

答えて

19

xamlにパラメータのないコンストラクタを持たないコントロールはありません。 antを使ってコードからインスタンス化しますが、xamlはそのコンストラクタを呼び出さないでしょう。あなたがコントロールにカスタムプロパティを追加するために求めている場合

public AjustControl(BaoC input) : this() 
{ 
    populateAdjustControl(input); 
} 

public AjustControl() 
{ 
    InitializeComponent(); 
} 

しかし、あなたはDependancyPropertyを追加することができます。この後

public static readonly DependencyProperty NameProperty= 
    DependencyProperty.Register(
    "Name", typeof(string), 
... 
    ); 
public string Name 
{ 
    get { return (string)GetValue(NameProperty); } 
    set { SetValue(NameProperty, value); } 
} 

、あなたはカスタムコントロールのコンストラクタにパラメータを渡す必要がある理由それはあなたの質問から明らかではない

<custom:AjustControl Name="something" /> 
+0

古い答えを見つけて申し訳ありませんが、私はこれを現在達成しようとしています。私の問題は、(データをロードできるように)コンストラクタでこのパラメータが必要なことです。ただし、依存関係プロパティは、コンストラクタの後にのみ設定されているようです。私はそれをどうやってできるのか考えていますか? – Shimrod

+0

プロパティはインスタンスオブジェクトの一部です。プロパティが静的でない限り、クラスがコンストラクタでインスタンス化される前にプロパティを設定することはできません。 –

+2

確かに。私は最後にDPがこの時点で設定されているので、 'Loaded'イベントを使用してデータをロードしました。ありがとう! – Shimrod

0

のようなあなたのコントロールを使用することができます。

  1. あなたがバインドされた値は、依存関係プロパティ機構を介してカスタムコントロールから親に渡される前に、問題のパラメータを消費するカスタムコントロールを必要とするので、それがかもしれ - 直接問題のコンストラクタのパラメータを消費する最も顕著なバウンドプロパティをか間接的に

  2. これは、パラメータ化されたコンストラクタによる初期化が何らかの理由であなたに行く唯一の方法である可能性があります。

ケース2の解決策はわかりませんが、この問題が発生した場合は、通常の要件です。この場合私の解決策は、通常のドットネットプロパティを作成することです。これは、依存関係プロパティの前に解決されます。

しかし、通常のドットネットプロパティに問題がある可能性があります。参照にどのようにバインドしますか?例えば、ビジュアルツリー内の制御?これには解決策がありますが、新しいバージョンのXAMLでのみ使用できます。あなたは

<MyCustomControl MyParameter="{x:Reference Name=Blah}"/> 

代わり

<MyCustomControl MyNonParameter="{Binding ElementName=Blah}"/> 

で書くことができますし、そのためにDPを作成する必要はありません。あなたのcustromコントロールで書き込みすることができます

class MyCustomControl { 
    // The parameter my constructor sadly can not have 
    public MyParameterType MyParameter { get; set; } 
関連する問題