2017-06-07 10 views
0

このプロパティを書くのCLRの方法です:WPF依存関係プロパティでプログラムで 'get'を使用する方法は?

public byte Value 
{ 
    get{ 
    return GetByteData(); 
    } 
    set{ 
    SetByteData(value); 
    } 
} 

私は同じ依存関係プロパティの方法を行う方法をよく読んできたが、これは私が自分で精一杯です:

public byte Value 
{ 
    get { return (byte)GetValue(ValueProperty); } 
    set { SetValue(ValueProperty, value); } 
} 

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
    "Value", typeof(byte), typeof(MyControl), 
    new FrameworkPropertyMetadata((byte)0, ValueChanged)); 

public static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    byte r = (byte)e.NewValue; 
    MyControl v = (MyControl)d; 
    v.SetByteData(r); 
} 

上記のスニペットを作成した例を見て、GetByteData()を配置する場所を見つけることができません。これは、ユーザーが対話するときの現在のUI状態の出力値を計算し、 'Value'を更新します。

これまではclrのようにゲッターに入れていましたが、間違ったアプローチだと感じましたが、間違っている可能性があります。どこに置くべきですか?もしそうでなければ、私のアプローチは何ですか?依存関係プロパティのためのプログラム的なゲッターを持つことは可能でしょうか?

解決策を探す際に間違ったキーワードを使用している可能性があります。私を正しい方向に導く助けがあれば、大変感謝しています。前もって感謝します。

+2

は残念ながら、依存関係プロパティは、 "コールバックを取得" がありません。それらのゲッターは常に、以前に設定された値(直接またはバインディング、スタイル、デフォルト値など)を返します。なぜあなたの財産は依存財産でなければならないのですか? – Clemens

+1

PropertyChangedCallbackの 'v.Value = r'の代入は冗長であることにも注意してください。プロパティは既にその値を持っています。サンプルコードから削除しました。 – Clemens

+0

ああ!全く別のアプローチ!つまり、ユーザーが対話するたびにイベントを発生させて依存関係の値を更新する必要がありますか? UIを同期させるために毎回 'SetByteData'を使うと思います。重複しているのですが、状態変数を使用してやり直しをスキップすることができると思います。 @依存関係が必要な理由: '{Binding Value、ElementName = MyControlName}'には別のUI要素が必要です。私はこれがclrのプロパティでうまくいくかどうか分かりません... – RiA

答えて

1

限り、それが唯一のソース(とないターゲット)であるような結合の性質、

{Binding Value, ElementName=MyControlName} 

のように、あなたはスタイルセッターで値を適用する、またはアニメーションはありませんプロパティは、依存関係プロパティである必要はありません。

ただ、このようなINotifyPropertyChangedを実装:

public partial class MyControl : UserControl, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public byte Value 
    { 
     get { return GetByteData(); } 
     set 
     { 
      SetByteData(value); 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value))); 
     } 
    } 

    ... 
} 
+0

私はたぶんそれをターゲットとして必要とするでしょう。しかし、私はそれをまだそのように実装する場所を見つけていません。これは、実際には個々のビットを表す一連のトグルボタンで 'バイト'を表示するコントロールです。また、同じユーザーコントロール内で手動で番号を入力するためのセクション。だから、私は多くの場所で使うつもりのライブラリコントロールのようなものです。依存関係プロパティを持つと役立つかもしれません。ユーザーが自分のコントロールとやりとりするたびに依存関係の値を更新し、それがどのように機能するかを見ていきます。 – RiA

+0

また、 'PropertyChanged?.Invoke'構文に感謝します。私はちょうど 'PropertyChanged(this、new ...);をやっているC++の方法に慣れているので、その作業をどうやって作るのだろうかと思っていた。 – RiA

+0

ガイダンスをありがとう。私はそれを働かせることができた。 wpf gettersはそのように動作しないか、手動で更新する必要があることを書いてください。私はその質問に最も関連する答えとしてマークします。 :) – RiA

関連する問題