设置在MVVM中Datagrid上绑定的Datatable的readonly secifics单元格

时间:2017-08-31 09:42:42

标签: c# wpf mvvm datatable datagrid

我有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来禁用编辑。

1 个答案:

答案 0 :(得分:0)

例如,您可以处理AutoGeneratingColumn事件以使列成为只读:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyName == "YourColumnName")
    {
        e.Column.IsReadOnly = true;
    }
}

修改:您可以使用StyleDataTrigger来禁用单个行或单元格的编辑:

<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;
}