WPF DataGrid中每个DataGridColumn有一个ObservableCollection

时间:2014-07-09 00:54:45

标签: .net wpf xaml mvvm wpfdatagrid

使用WPF开发MVVMLight应用。

我正在尝试将DataGridColumn的每个DataGridAutoGenerateColumns设置为False)绑定到每列ObservableCollection<string>DataGridI've already asked something similar并得到了一个非常好的答案,但这种方法的问题是项目一次只在Model行中添加。这种方法还引入了一个新的TwoWay类,这使Model与我需要保持与View同步的实际ObservableCollection<string>类绑定成为一个问题。

我的问题是:假设我有几个ObservableCollection<string>完全相同的计数/长度,是否可以每列绑定一个ObservableCollection<ObservableCollection<string>>?到目前为止,我的方法是:

  • GridColumns上创建一个ViewModel(我们将其命名为ObservableCollections<string>)属性,其中包含我需要的每个ItemsSource
  • DataGrid的{​​{1}}绑定到GridColumns
  • 设置每个的绑定 对DataGridColumn
  • 中的每个ObservableCollection<string> GridColumns {。}}

我似乎无法让它工作。我完全不喜欢这种方法吗?

修改

以下是我提出的建议:

1)创建一个Model类,公开ObservableCollection属性

 public class AttributeListItems : ObservableObject
    {
        private ObservableCollection<string> category;
        public ObservableCollection<string> Category
        {
            get { return category; }
            set
            {
                if (category == value)
                {
                    return;
                }
                category = value;
                RaisePropertyChanged(() => Category);
            }
        }
        private ObservableCollection<string> fileValue;
        public ObservableCollection<string> FileValue
        {
            get { return fileValue; }
            set
            {
                if (fileValue == value)
                {
                    return;
            }
                fileValue = value;
                RaisePropertyChanged(() => FileValue);
            }
        }
    }

2)在ObservableCollection<AttributeListItems>

上创建了ViewModel的属性
    private ObservableCollection<AttributeListItems> gridItems;
    public ObservableCollection<AttributeListItems> GridItems
    {
        get { return gridItems;  }
        set
        {
            if (gridItems == value)
            { return; }
            gridItems = value;
            RaisePropertyChanged(() => GridItems);
        }
    }

3)在我setter的{​​{1}}属性的SelectedAttribute上(我想要ViewModel重新填充)我添加了这个:

GridItems

4)在我的 gridItems.Clear(); gridItems.Add(new AttributeListItems { Category = selectedAttribute.Categories, FileValue = selectedAttribute.FileValues } ); RaisePropertyChanged(() => GridItems); 上,我将View的{​​{1}}设置为ItemsSource,并将其列绑定到DataGrid,如下所示:

GridItems

运行时,Category只在列中显示一行,其文本为<DataGrid Grid.Row="0" Grid.ColumnSpan="2" Margin="5" AutoGenerateColumns="False" ItemsSource="{Binding GridItems}" EnableColumnVirtualization="True" CanUserReorderColumns="False" CanUserSortColumns="False" VerticalScrollBarVisibility="Visible" > <DataGrid.Columns> <DataGridTextColumn Header="categories" Width="auto" Binding="{Binding Category}" /> <!--<DataGridTextColumn Header="file values" Width="auto" Binding="{Binding FileValue}" />--> </DataGrid.Columns> </DataGrid> 。我尝试将列的绑定从DataGrid更改为"(Collection)",这部分有用:它只显示Category集合的第一个值,而不是全部他们,这就是我现在被困住的地方。

1 个答案:

答案 0 :(得分:1)

首先,你需要一个

class RowItem
{
    bool IsChecked;
    string Category;
    string FileValue;
}

然后通过类似

之类的东西填充RowItem s集合
GridData = new ObservableCollection<RowItem>();

最后在XAML中,

<DataGrid Grid.Row="0" Grid.ColumnSpan="2" Margin="5" AutoGenerateColumns="False" ItemsSource="{Binding GridData}" EnableColumnVirtualization="True" CanUserReorderColumns="False" CanUserSortColumns="False" VerticalScrollBarVisibility="Visible" >
                <DataGrid.Columns>
                    <DataGridCheckBoxColumn Header="Is Checked" Width="auto" IsChecked="{Binding IsChecked}" />
                    <DataGridTextColumn Header="Categories" Width="auto" Binding="{Binding Category}" />
                    <DataGridTextColumn Header="File values" Width="auto" Binding="{Binding FileValue}" />
                </DataGrid.Columns>
</DataGrid>

此外,您似乎有selectedAttribute.CategoriesselectedAttribute.FileValues个集合作为数据源。 假设它们具有相同的长度,GridData可以填充:

var rowItems = new List<RowItem>();

for( int i = 0; i < selectedAttribute.Categories.Count; i++ )
{
    var row = new RowItem 
    { 
        Category =  selectedAttribute.Categories[i],
        FileValues =  selectedAttribute.FileValues[i],
    };
    rowItems.Add(row);
}

GridData = new ObservableCollection<RowItem>(rowItems);