WPF DataGrid / ListView绑定到数组mvvm
我们假设你有
- 一个N个整数的数组
- 表示行数的整数值
在模型中。 整数绑定到视图中的ComboBox。
Q1)如何将数组(或数组的各个项)绑定到DataGrid或ListView控件,以便:
- 当您更改ComboBox值时,只有在DataGrid或ListView中可见/生成的行数
- DataGrid或ListView的各行包含允许编辑数组中相应值的TextBoxes(或类似)。 绑定必须是双向的。
即如果我在ComboBox中选择5,则只能看到5行,其中包含5个文本框,每个文本框都绑定到数组的前5个项目。
Q2)您如何向DataGrid / ListView提供另一列(仅文本信息),以便:
- 第一行总是读为0.每个后续行都会显示:’上一行’+’360除以ComboBox选择值’(假设为了简单起见它将限于偶数)。
任何帮助或建议都非常感谢。
谢谢。
编辑(22.11.2013):
根据Sheridan的建议,我将这个问题与我的另一个问题联系起来, 这个问题有更多关于这个问题的信息(和背景)。
最初我打开了这个问题,因为我认为仅仅针对裸机制的任何背景问题都会得到更好的理解和更好的回答机会。
我有所纠正。
好的,所以如果你要正确地做到这一点,你首先需要创建一个数据类型/模型类来保存你的数据。 它应该正确实现INotifyPropertyChanged
接口 ,并为要在DataGrid
显示的每个列包含一个属性, 包括一个满足’Q2’要求的额外列。
接下来,您要将两个ObservableCollection
类型的属性添加到/ view模型后面的代码中。 第一个将保存整个集合,第二个将显示您想要的行数。 您还需要一个integer
属性来Bind
到ComboBox
的选定项:
...
现在,只要在视图模型中SelectedItem
属性发生更改,您只需更新FilteredItems
属性中的项目行数:
public int SelectedItem { get { return selectedItem; } set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); UpdateFilteredItems(); } } ... private void UpdateFilteredItems() { FilteredItems = new ObservableCollection(Items.Take(SelectedItem)); }
在UpdateFilteredItems
方法中,我们只根据SelectedItem
值从整个Items
集合中获取相关数量的项目。 由于FilteredItems
集合绑定到DataGrid.ItemsSource
,UI将自动更新。