使用WPF
开发MVVMLight
应用。
我正在尝试将DataGridColumn
的每个DataGrid
(AutoGenerateColumns
设置为False
)绑定到每列ObservableCollection<string>
个DataGrid
。 I'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
集合的第一个值,而不是全部他们,这就是我现在被困住的地方。
答案 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.Categories
和selectedAttribute.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);