WPF DataGrid / ListView绑定到数组mvvm

时间:2013-11-19 09:21:53

标签: c# wpf mvvm binding

我们假设您有

  • N个整数数组
  • 表示行数的整数值

在模型中。整数绑定到视图中的ComboBox。

Q1)如何将数组(或数组的各个项)绑定到DataGrid或ListView控件,以便:

  • 更改ComboBox值时,只有在DataGrid或ListView中可见/生成的行数
  • DataGrid或ListView的各行包含允许编辑数组中相应值的TextBoxes(或类似行)。绑定必须是双向的。

即。如果我在ComboBox中选择5,则只能看到5行,其中包含5个TextBox,每个TextBox都绑定到数组的前5个项目。

Q2)您如何向DataGrid / ListView提供另一列(仅文本信息),以便:

  • 第一行总是读为0.每个后续行都会显示:'上一行'+'360除以ComboBox选择值'(假设为简单起见,它将限于偶数)。

非常感谢任何帮助或建议 谢谢。

编辑(22.11.2013):
根据{{​​3}}的建议,我将Sheridan与我的另一个问题相关联,该问题包含更多有关此问题的信息(和背景信息)。

最初,我打开了这个问题,因为我认为只有简单的机制才能解决任何背景问题会更好地理解并有更好的机会得到回答。
我的立场得到了纠正。

1 个答案:

答案 0 :(得分:1)

好的,所以如果你要正确地做到这一点,你首先需要创建一个数据类型/模型类来保存你的数据。它应该正确实现INotifyPropertyChanged interface,并为要在DataGrid 中显示的每个列包含一个属性,包括一个额外的“Q2”要求

接下来,您要将两个类型为ObservableCollection<YourDataType>的属性添加到/ view模型后面的代码中。第一个将保存整个集合,第二个将显示您想要的行数。您还需要一个integer属性BindComboBox的所选项目:

<DataGrid ItemsSource="{Binding FilteredItems}" ... />
...
<ComboBox ItemsSource="{Binding Numbers}" SelectedItem="{Binding SelectedItem}" />

现在,只要SelectedItem属性在视图模型中发生更改,您只需更新FilteredItems属性中的项目行数:

public int SelectedItem
{
    get { return selectedItem; }
    set
    {
        selectedItem = value;
        NotifyPropertyChanged("SelectedItem");
        UpdateFilteredItems();
    }
}
...
private void UpdateFilteredItems()
{
    FilteredItems = 
        new ObservableCollection<YourDataType>(Items.Take(SelectedItem));
}

UpdateFilteredItems方法中,我们只根据Items值从整个SelectedItem集合中获取相关数量的项目。由于FilteredItems集合绑定到DataGrid.ItemsSource,因此UI将自动更新。