我需要一些帮助来实现一些数据绑定。我的viewmodel公开了以下属性:
public List<string> ChosenFeatures {get;set;}
public Dictionary<string, double> AllFeatureCosts {get;set;}
“ChosenFeatures”将包含“AllFeatureCosts”中存在的字典键子集。
在视图中,我想渲染一系列TextBlock,一个用于“ChosenFeatures”中的每个项目。下面是棘手的部分: - 每个TextBlock的Text属性需要绑定到“AllFeatureCosts”字典中的值,使用“ChosenFeatures”中的字符串作为该字典项的键。
对于如何编写XAML以实现此目的,我将不胜感激。
答案 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中)。
注意: 根据字典的大小,它可能会影响应用程序的性能......