我有DataTable
填充并绑定到我的DataGrid
,我想知道如何按照MVVM方法设置一些特定的单元格。
我的DataGrid:
<DataGrid ItemsSource="{Binding oTable, Mode=TwoWay}" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="True" ColumnWidth="*">
我不知道该怎么做。我应该将bool
绑定到只读属性,还是在填充DataTable
时执行其他操作?
感谢建议;)
编辑1:
我使用绑定到Datagrid的数据表,以便能够在运行时填充它,并且能够动态生成列,但如果您有其他解决方案可以做到这一点,我将很乐意尝试它
编辑2:
这就是我填充DataTable
的方式。
我放入的数据是分层结构的(使用复合设计模式(元素是复合材料,属性是叶子),我只放置具有某些属性的元素。所以我在每个叶子上都有一个属性isEditable
在以下代码中,可以使用attr.isEditable();
进行访问。
private void getNewData(List<ElementBaseViewModel> rootElement)
{
_oTable.Clear();
foreach (var element in rootElement)
{
buildFromChildren(element);
}
var tempTable = _oTable;
_oTable = null;
RaisePropertyChanged("oTable");
_oTable = tempTable;
RaisePropertyChanged("oTable");
}
private void buildFromChildren(ElementBaseViewModel element)
{
if(element.Children != null)
{
if (isAttributeChildren(element))
{
DataRow oRow = _oTable.NewRow();
foreach (var attribute in element.AttributeChildren)
{
Model.Attribute attr = (Model.Attribute)attribute.Element;
if (!_oTable.Columns.Contains(attr.name))
_oTable.Columns.Add(attr.name);
oRow[attr.name] = attr.Value;
}
_oTable.Rows.Add(oRow);
}
foreach (var elem in element.ElementChildren)
{
buildFromChildren(elem);
}
}
}
我理解mm8提出的解决方案,但我不明白如何绑定isEditable
来禁用编辑。
答案 0 :(得分:0)
例如,您可以处理AutoGeneratingColumn
事件以使列成为只读:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName == "YourColumnName")
{
e.Column.IsReadOnly = true;
}
}
修改:您可以使用Style
和DataTrigger
来禁用单个行或单元格的编辑:
<DataGrid x:Name="dg" ItemsSource="{Binding oTable, Mode=TwoWay}"
CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="True" ColumnWidth="*"
AutoGeneratingColumn="datagrid_AutoGeneratingColumn">>
<DataGrid.Resources>
<Style x:Key="txtStyle" TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding isEditable}" Value="True">
<Setter Property="IsReadOnly" Value="True" />
<Setter Property="Cursor" Value="Arrow" />
<Setter Property="Focusable" Value="False" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Foreground" Value="White" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
</DataGrid>
private void datagrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var col = e.Column as DataGridTextColumn;
if (col != null)
col.EditingElementStyle = datagrid.Resources["txtStyle"] as Style;
}