【问题标题】:WPF binding tricky issueWPF绑定棘手问题
【发布时间】:2012-08-23 22:34:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么不让ChosenFeatures 另一个Dictionary&lt;string,double&gt; 而不是只携带钥匙呢?
  • @Jay AllFeatureCosts 是一个单例,用于驱动整个应用程序的各种视图,其值将不断变化(由 b/g 线程更新)。我希望我可以在 XAML 中做我需要的事情,但我怀疑解决方案会很糟糕或不可能!相反,我想我可以让视图模型订阅 AllFeatureCosts 上的更改事件并更新 ChosenFeatures 中的值(这将是您建议的字典)。

标签: wpf


【解决方案1】:

为数据提供一个 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,请在 FeatureViewModel 上提出任何更改。当然,您需要使这些集合保持同步,这可能需要一些工作。

当然,您的 DataTemplate 也需要一些调整

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

【讨论】:

    【解决方案2】:

    首先,我想你应该使用@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;
      }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-08
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多