2009-03-25 7 views
2

基本的にボタンであるUserControlを作成しました。これは、画像とその上にラベルを持っていると私はそうのようなイメージの源とラベルのテキストを設定するには、2つのプロパティを作成しました:しかしC#WPFカスタムコントロールは、デザイン時にXAMLプロパティに応答しませんか?

 public ImageSource Icon 
    { 
     get { return (ImageSource)this.GetValue(IconProperty); } 
     set { this.SetValue(IconProperty, value); icon.Source = value; } 
    } 
    public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(NavigationButton)); 

    public string Text 
    { 
     get { return (string)this.GetValue(TextProperty); } 
     set { this.SetValue(TextProperty, value); label.Content = value; } 
    } 

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(NavigationButton)); 

、私は私のページにコントロールを追加した、コントロールを私はXAMLで設定したプロパティに応答しません。 <controls:MusicButton Icon="/SuCo;component/Resources/settings.png/>は何もしません。

私は間違っていますか?

答えて

5

依存プロパティをラップするCLRプロパティneverは、GetValueSetValueを呼び出す以外のロジックを持つ必要があります。それは、たとえ呼び出されなくてもよいからです。たとえば、XAMLコンパイラは、CLRプロパティを使用するのではなく、GetValue/SetValueを直接呼び出して最適化します。

あなたは依存関係プロパティが変更されたときに、いくつかのロジックを実行する必要がある場合

は、メタデータを使用します。私の最初の答えでは

public ImageSource Icon 
{ 
    get { return (ImageSource)this.GetValue(IconProperty); } 
    set { this.SetValue(IconProperty, value); } 
} 

public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(NavigationButton), new FrameworkPropertyMetadata(OnIconChanged)); 

private static void OnIconChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    //do whatever you want here - the first parameter is your DependencyObject 
} 

EDIT

を、私はあなたのコントロールのXAML(からそれをすることを想定しテンプレートまたはUserControlで直接)プロパティに正しく接続されます。あなたはXAMLを私たちに示していないので、おそらく間違った前提でした。

<StackPanel> 
    <Image Source="{Binding Icon}"/> 
    <TextBlock Text="{Binding Text}"/> 
</StackPanel> 

そして、あなたのDataContextをコントロール自体に設定する必要があります。あなたはさまざまな方法でこれを行うことができますが、ここでは背後にあるコードから、それを設定するのは非常に簡単な例です:

public YourControl() 
{ 
    InitializeComponent(); 
    //bindings without an explicit source will look at their DataContext, which is this control 
    DataContext = this; 
} 
+0

私が追加「dependencyObject.SetValue(Image.SourceProperty、e.NewValueは);」 OnIconChangedのvoidに変換し、設計や実行時には何もしないように見えます。 XAMLのデフォルトのSource値をクリアしても、それを修正することはできません。それ以上のアドバイスはありますか? :P –

+0

私の編集は役に立ちますか?そうでない場合は、すべてのコードとXAMLを投稿できますか? –

0

テキストプロパティも設定してみましたか?画像のソースが間違っている可能性があります。テキストははるかに単純です。

また、あなたの例では、引用符がありませんでした。したがって、実際のコードからコピーされている場合は、それを確認することができます。

あなたの問題の原因は考えられませんが、私はコードにその効果があるかどうかを確認するプロパティを設定することをお勧めします。それがある場合は、実際にXAMLを確認する必要があります。

コードの残りの部分を投稿していないので、コントロールに影響する可能性のある問題があるかどうかはわかりません。

はい、私はそれほど役に立ちませんが、私はちょっとだけWPFで作業しています。とにかくそれが助けてくれることを願います

関連する問題