2009-07-12 30 views
12

私はIValueConverterを持っています。その仕事はBlockIdをConditionLabelに変換することです。問題は、私のModelオブジェクトが実際の変換を行うスマートなものであるということです。私のコード現時点では、この今のところ...XAMLのIValueConverterにデータを渡すにはどうすればよいですか?

public class BlockIdToConditionLabelConverter : IValueConverter 
{ 
    private Model _model; 

    public BlockIdToConditionLabelConverter(Model model) 
    { 
     _model = model; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     int blockId = (int)value; 
     return _model.BlockIdToConditionLabel(blockId); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Binding.DoNothing; 
    } 
} 

のように見える、私はこのようなのResourceDictionaryで静的リソースを作成(およびそれ以降のDataTemplateでそれを参照してください):

<local:BlockIdToConditionLabelConverter 
    x:Key="_blockIdToConditionLabelConverter" /> 

問題は、私はこのコンバータに私のModelオブジェクトを渡す方法が必要です。どうすればいい?

ありがとうございました。

答えて

7

これはバリューコンバータの古典的な問題です。

MVVMパターンを使用している場合は、モデルのViewModelで変換を実装することでその問題を解決できます。

そうでない場合は、this post on MSDN forumsをご覧ください。 (サムベント - MSFTからの回答)

目的は、マルチバインディングを使用してモデルをコンバーターに渡すことです。この場合は、DataContextを渡します。

+0

さて、私はMVVMを読んでいます:)パターンが解決したいと思うような問題に遭遇していたので、私はそれを使い始めるのが大変意味があるかもしれません。論理?私は「あなたのモデルのViewModelの内部で変換を実装する」という意味を十分に理解しています。私はIValueConvertersを全く使わないということですか?または、ViewModel(XAMLマークアップではなく)がそれらをインスタンス化するジョブを持っているだけですか?ありがとう! – devuxer

+1

Modelクラスの実装方法がわかりません。 MVVMでは、WPFでモデルをDataContextとして使用する代わりに、ViewModelをDataContextとして使用します。 元々モデルのBlockIdプロパティをバインドしていたと思います。 ViewModelにはBlockIdの代わりにバインドするConditionLabelというプロパティがあります。このプロパティは、ゲッター内の変換を行います。 ViewModelがモデルのPropertyChangedに登録されるため、ViewModelでRaisePropertyChange( "ConditionLabel")を実行できます。 – decasteljau

+0

私はMVVMについてもう少し読んだので、これは理にかなっています。変換したデータをViewModelに保存し、IValueConvertersを完全に削除するだけで済みます。しかし、私はこのIValueConverterをGridViewで使用する予定だったので、変換されたデータのテーブル全体をViewModel(単一のプロパティではない)に格納する必要があります。 IValueConverterはまだそれに意味がありますか?また、ブロックが完全なライトグレーのどこにあるすべてのGridViewセルを有効にしたいのですか? ViewModelに "IsComplete"テーブルを保存しても、それをまだ色に変換する必要があります。 – devuxer

関連する問題