2016-08-10 7 views
0

DependencyPropertyのレイトバインディングのようなものを作成したいと思います。 私はListViewのアイコンを持っています。アイコンが実際に必要/表示されるときにのみロードされます。アイコン要素が表示されると、IconPropertyGetValueが呼び出されますが、デフォルト値(null)しか返されません。私は、初期値がnullのときに関連するアイコンをロードするコードを注入したい。DependencyPropertyを最初に読み込んだときのコードの実行方法は?

私の最初のアプローチは、DependencyPropertyを一切使わずにプロパティのカスタムゲッター/セッターを作成することでした。しかし、それは最適かどうか疑問に思う。

私がDependencyPropertyを使用した場合、変更された時刻はいつ変更されるのかは、OnPropertyChangedで簡単に判断できます。私はいつgetterの初期化を注入すべきか分かりません。

public class DisplayItem : DependencyObject { 

    // ... 

    public static readonly DependencyProperty IconProperty = 
     DependencyProperty.Register(
      "Icon", 
      typeof(ImageSource), 
      typeof(DisplayItem), 
      null 
     ); 

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

    private void GetIcon() { 
     // Some code to actually fetch the icon image... 
     // ... 
     Icon = loadedImageSource; 
    } 

    // ... 

} 

は、上記のコードを考えてみましょう:最初のGetValue()が発生する前に、正確にGetIcon()を呼び出す方法?

+1

[async binding](https://msdn.microsoft.com/en-us/library/system.windows.data.binding.isasync(v = vs.110).aspx)を使用すると、それは初めて要求されたものです。 MVVMを使用することを検討してください。依存関係のプロパティは必要ありませんが、通知付きの単純なもの( 'INotifyPropertyChanged')が必要です。アイテムビューモデル( 'ListView.ItemsSource'にバインドされているコレクション)はIconを保持できます。 – Sinatr

+0

非同期バインディングに言及してくれてありがとうございます。これはアイコンの正しい選択のようですが、とにかくここでMVVMを実装しました。私の 'DisplayItem'が' ItemSource'によって使用される 'ObservableCollection'に属していると考える方が良いでしょう。 – Harry

答えて

1

依存プロパティを使用しないでください。

(オプションINotifyPropertyChanged実装と)無地CLRプロパティは十分です:

public class DisplayItem : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private ImageSource icon; 

    public ImageSource Icon 
    { 
     get 
     { 
      if (icon == null) 
      { 
       icon = ... // load here 
      } 
      return icon; 
     } 
     private set 
     { 
      icon = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Icon")); 
     } 
    } 
} 
+0

他の双方向バインディング(アイテム 'CheckBox'は' CheckBox'カラムに影響を与えます)に 'DependencyObject'が必要ですが、私は両方を持つことができるので、アイコンプロパティをplainに変更しました。ありがとう。 – Harry

+1

DisplayItemは、バインディングが双方向であっても、そのプロパティがバインディングのソースである限り、DependencyObjectである必要はありません。一般に、ビューモデルクラスは決してDependencyObjectであってはなりません。 – Clemens

+0

あなたは本当に正しいです、私はクラスをビューモデルを修正するように変換しました。ありがとうございました。 – Harry

1

なぜあなたは依存関係プロパティの値にアクセスしているときは知りたいですか? ビュー内のいくつかのプロパティにバインドされている場合、プロパティは最初にコンポーネントをロードするときにアクセスされます。したがって、Loadedの場合はGetIcon()と呼ぶことができます。 MVVMを使用している場合は、Loadedイベントをいくつかのコマンドにバインドします。それ以外の場合は、単にイベントを処理して関数を呼び出します。

MVVMパターンに移動する予定がある場合は、他の回答が示すようにCLRプロパティを使用するだけで、このトリックが実行されます。

+0

MVVMが正しい選択だと思われます。私は間違ったことをしていたことを知っていました:)しかし、MSDNによると: "モデルはINotifyPropertyChangedインターフェイスを実装し、プロパティが変更されたときにPropertyChangedイベントを発生させることによってこの要件を満たします。 MVVMでCLRプロパティを使用する必要があります。 – Harry

+0

**はい。正確に。** 依存関係プロパティは、依存関係プロパティがビュー内の一部のコントロールのプロパティにバインドされるように、再利用可能なコントロールの場合に主に使用されます。これは、ビューを更新するViewModelのCLRプロパティにバインドされる可能性があります。したがって、CLRプロパティにバインドするのが最善の方法です。 – ViVi

関連する問題