我有一个要求,我必须在网格上(在 devexpress gridcontrol 上)显示一些带有可编辑复选框控件的只读数据以供用户输入,但这些列应该是动态生成的。所做的任何更改网格(复选框)都将保存在后端.
为此,我参考了这篇文章:
动态数据网格http://paulstovell.com/blog/dynamic-datagrid
如果我与 Visual Studio (2010) WPF Datagrid 一起使用,代码工作正常。但是当我使用 devexpress gridcontrol 而不是 gridcontrol(checkbox 列)时,默认情况下不可编辑。为了解决这个问题,我使用了 datatemplate,但我面临着另一个问题尽管模式为“TwoWay”,但在集合后面的代码中没有更新。
任何帮助,将不胜感激。
环境:VS 2010,WPF,Devexpress control 12.1
devexpress gridcontrol 的代码片段更改如下:
(INotifyPropertyChanged 已实施)
private ObservableCollection<Record> records;
public ObservableCollection<Record> Records
{
get
{
return records;
}
set
{
records = value;
OnPropertyChanged(() => Records);
}
}
构造函数部分:
records = new ObservableCollection<Record>();
Records.Add(new Record(new Property("FirstName", "Paul"), new Property("LastName", "Stovell"), new Property("IsEnabled", true)));
Records.Add(new Record(new Property("FirstName", "Tony"), new Property("LastName", "Black"), new Property("IsEnabled", false)));
var columns = Records.First()
.Properties
.Select((x, i) => new { Name = x.Name, Index = i })
.ToArray();
foreach (var column in columns)
{
var x = string.Format("Properties[{0}].Value", column.Index);
var binding = new Binding(string.Format("Properties[{0}].Value", column.Index));
{
dataGrid.Columns.Add(new GridColumn()
{
Header = column.Name,
DisplayMemberBinding = binding,
AllowEditing = DefaultBoolean.True,
CellTemplate = (DataTemplate)Application.Current.FindResource("AttributeDisplayTemplate")
});
}
<DataTemplate x:Key="AttributeDisplayTemplate">
<CheckBox MinWidth="70" IsEnabled="True" IsChecked="{Binding Path=Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
Xaml 部分
<dxg:GridControl x:Name="dataGrid" ItemsSource="{Binding Records}"
AutoPopulateColumns="False" IsEnabled="True" Width="650">
<dxg:GridControl.View>
<dxg:TableView BestFitArea="All" AllowBestFit="True" ShowGroupPanel="False" NavigationStyle="Cell"
>
</dxg:TableView>
</dxg:GridControl.View>
</dxg:GridControl>