【发布时间】:2014-02-13 04:10:49
【问题描述】:
情况如下:我有一个对象列表,每个对象都有一个 ID 号。我正在尝试根据对象的 ID 号在列表视图的列中设置一个值:
<ListView Name="Listview1"
Itemsource="{Binding ObjectList}">
<ListView.View>
<GridView>
<GridViewColumn Header="Header1" DisplayMemberBinding="{Binding subObject.property}"/>
<GridViewColumn Header="Header2" DisplayMemberBinding="{Binding PropertyOfAnItemInAList"/>
</GridView>
</ListView.View>
</ListView>
ObjectList 是 ViewModel 中的一个属性,向 ListView 证明一个 ObservableCollection 进行处理。 Header1 和 Header2 绑定到 ObservableCollection 中名为“ObjectList”的项目中的属性。
这一切都适用于 Header1。问题是 Header2 需要从驻留在 ObservableCollection 的每个元素内的列表中选择一个项目,并根据 ObjectList 中引用项目的另一个属性显示它。
那么我该怎么做呢?
我已经设法通过在 ObjectList 中的对象内设置一个名为“currentSelection”的变量来使其工作,然后当绑定从 ItemSource 遍历 ObjectList 以生成 ListView 时,该变量被设置:
public ObservableCollection<theObject> ObjectList {
get {
foreach (theObject obj in sourceCollection) {
obj.CurrentID = MyID;
}
return new ObservableCollection<theObject>sourceCollection // <-- secondary question: Is this the best way to send an observableCollection to a View???
}
}
但是,这感觉有点像 hack,而不是最佳实践,那么还有其他更好的方法来完成同样的事情吗?
编辑:
这是 ObjectList 中对象的 sn-p,就像我现在拥有的一样。
public class ObjectInObjectList {
/* constructor and various properties snipped to save space */
private subObject subObj;
public int CurrentID {get; set;}
public SubObject {
get { return subObject; } // etc...
}
private SortedList<int,int> valuesIWantInSecondColumn
Public int PropertyOfAnItemInAList {
return valuesIWantInSecondColumn[currentID];
}
【问题讨论】:
-
我不确定我是否理解您的问题。您是否只是在寻找将 MyID 放入带有 Header1 标题的列的最佳方法?
-
我重读了它,现在认为您正在尝试将“Header2”列绑定到不同的属性,具体取决于在另一个控件中选择了哪个项目,并且您通过使用带有开关的另一个属性(CurrentID)来完成此操作根据情况返回特定属性的语句。这是准确的吗?能否展示一下theObject的相关代码?
-
李 - 这非常正确。我将在问题的编辑中添加相关代码。