WPF绑定棘手的问题

时间:2012-08-23 14:01:44

标签: wpf

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

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

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

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

对于如何编写XAML以实现此目的,我将不胜感激。

3 个答案:

答案 0 :(得分:0)

为数据提供ViewModel,这就是首先使用MVVM的原因。

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

将viewmodel的集合添加到主viewmodel

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

并在某处初始化

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

从这里您也可以根据需要,如果您正确实施了INotifyPropertyChanged,请在FeatureViewModel上引发任何更改。你当然需要保持这些集合同步,这可能有点工作。

当然,您的DataTemplate还需要进行一些调整

<DataTemplate DataType="{x:Type FeatureViewModel}">
    <TextBlock Text="{Binding Value}"/>
</DataTemplate> 

答案 1 :(得分:0)

首先,我想你应该使用@ Jay的方法并制作ChosenFeatures词典。

但是,您可以使用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;
  }

答案 2 :(得分:0)

而不是绑定“ChosenFeatures”绑定“AllFeatureCosts”。我们知道它将显示完整的列表,然后我们可以编写一个简单的Multibinding可见性转换器来显示所选的项目(在ChosenFeatures中)。

注意: 根据字典的大小,它可能会影响应用程序的性能......