0

我需要一些帮助来实现一些数据绑定。我的视图模型公开了以下属性:

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

“ChosenFeatures”将包含“AllFeatureCosts”中存在的字典键子集。

在视图中,我想渲染一系列 TextBlocks,“ChosenFeatures”中的每个项目一个。这是棘手的部分:- 每个 TextBlock 的 Text 属性需要绑定到“AllFeatureCosts”字典中的一个值,使用“ChosenFeatures”中的字符串作为该字典项的键。

我将不胜感激有关如何编写 XAML 来完成此任务的任何指示。

4

3 回答 3

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 回答
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 回答