【问题标题】:Bind to specific item in collection without indexer在没有索引器的情况下绑定到集合中的特定项目
【发布时间】:2014-02-28 10:01:03
【问题描述】:

我正在使用 EF5 数据模型,其中相关实体被收集到一个 HashSet 中。我想将一个元素绑定到 HashSet 中的第一个相关实体。我在 SO(herehere)上看到了建议使用以下内容的答案:

<DataGridComboBoxColumn SelectedValueBinding="{Binding LeadSteps[0].NewZoneID}"/>

但这依赖于具有索引器的集合,而 HashSet 没有。

(如果无法做到这一点,我可以在实体的部分类中创建一个属性,并绑定到该实体。)

当集合没有实现集成索引器时,如何绑定到集合中的第 n 个项目?

【问题讨论】:

    标签: wpf data-binding hashset


    【解决方案1】:

    我知道这是一个老问题,但我也遇到了同样的问题,并找到了我想分享的解决方案。

    对我有用的是更改引用成员的声明:

    public virtual ICollection<MyType> MyVarName { get; set; }
    

    到:

    public virtual IList<MyType> MyVarName { get; set; }
    

    在此更改之后,可以使用普通访问器访问集合项:

    <TextBlock Text="{Binding MyVarName[0].MyMemberName}" />
    

    【讨论】:

      【解决方案2】:

      您可能需要重新考虑整个情况。 HashSet 是一组独特的项目,而不是一个集合。集合只是为了维护一组成员并使您能够检查特定项目是否是成员......没有索引,因为集合项目之间没有顺序。

      虽然您可以在HashSet 上调用Enumerable.ElementAt&lt;TSource&gt; 方法,但您不能保证在向该方法提供相同的输入值时它会返回相同的元素。最重要的是,如果 HashSet 中的项目顺序对您很重要,那么您应该改用集合。

      但是,如果您选择忽略此建议,这就是您实现要求的方法...只需为您的单个 HashSet 值定义一个包装器属性...您可以尝试这样的事情:

      public YourHashSetDataType Hash
      {
          get { return LeadSteps.ElementAt(0).NewZoneID; }
          set { LeadSteps.ElementAt(0).NewZoneID = value; NotifyPropertyChanged("Hash"); }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多