0

データバインディングを実装するには、いくつかの支援が必要です。私のviewmodelは、次のプロパティを公開しています。

public List<string> ChosenFeatures {get;set;}
public Dictionary<string, double> AllFeatureCosts {get;set;}

「ChosenFeatures」には、「AllFeatureCosts」に存在する辞書キーのサブセットが含まれます。

ビューでは、「ChosenFeatures」の各アイテムに1つずつ、一連​​のTextBlockをレンダリングしたいと思います。トリッキーな部分は次のとおりです。-各TextBlockのTextプロパティは、「ChosenFeatures」の文字列をそのディクショナリアイテムのキーとして使用して、「AllFeatureCosts」ディクショナリの値にバインドする必要があります。

これを実現するためにXAMLを作成する方法についてのアドバイスをいただければ幸いです。

4

3 に答える 3

0

「ChosenFeatures」をバインドする代わりに、「AllFeatureCosts」をバインドします。完全なリストが表示されることがわかっているので、(ChosenFeaturesで)選択されたアイテムを表示するための単純なマルチバインディング可視性コンバーターを作成できます。

注:辞書のサイズによっては、アプリケーションのパフォーマンスに影響を与える可能性があります...

于 2012-08-23T14:34:46.903 に答える
0

データのViewModelを提供します。これが、最初にMVVMを使用する理由です。

class FeatureViewModel
{
    public FeatureViewModel(MyViewModel aViewModel, string aKey)
    {
        mParent = aViewModel;
        mKey = aKey
    }
    public string Value
    {
        get{return mParent.AllFeatureCosts[mKey];}
    }
}

ビューモデルのコレクションをメインのビューモデルに追加します

public ObservableCollection<FeatureViewModel> Features{ get; set; }

どこかで初期化します

foreach(var feature in ChosenFeatures)
{
    Features.Add(new VisualFeature(this, feature) );
}

ここから、必要に応じてINotifyPropertyChangedを適切に実装している場合は、FeatureViewModelsに変更を加えることもできます。もちろん、これらのコレクションの同期を維持する必要がありますが、これは少し手間がかかる場合があります。

もちろん、DataTemplateにもいくつかの調整が必要です

<DataTemplate DataType="{x:Type FeatureViewModel}">
    <TextBlock Text="{Binding Value}"/>
</DataTemplate> 
于 2012-08-23T14:21:45.153 に答える
0

まず、@ Jayのアプローチを使用して、ChosenFeaturesDictionaryも作成する必要があると思います。

ただし、Converter代わりに使用して、バインド中にパラメーターのように辞書を渡すことができます。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
  var key = (string)value;
  var dictionary = (Dictionary<string, double>)parameter;

  if (dictionary.ContainsKey(key))
    return dictionary[key];
  else
    return null;
  }
于 2012-08-23T14:30:50.970 に答える