2017-08-31 3 views
-2

私はDataTableを埋め込み、DataGridにバインドしています。MVVMの手法に従って読み込み専用のセルを設定する方法を知りたいです。MVVMのDatagridにバインドされたDatatableの読み込み専用セルを設定する

私のDataGrid:

<DataGrid ItemsSource="{Binding oTable, Mode=TwoWay}" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="True" ColumnWidth="*"> 

私はそれを行う方法がわかりません。私はboolをreadonlyプロパティにバインドするか、DataTableを埋め込むときに何か他のことを行う必要がありますか?助言する

感謝;)

EDIT 1:

私はruningて時間の間にそれを埋めるために、列が動的に生成されていことができるようにできるようにするデータグリッドにバインドさDATATABLEを使用しますが、あなたがそれを可能にする他の解決策を持っているなら、私はそれを試してみてうれしいです。

EDIT 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をバインドする方法を理解していない。あなたは、たとえばAutoGeneratingColumnイベントを処理することができ

+0

私はあなたが細胞を言う知っているが、それは特定の細胞ですか読み込み専用にする列? – stuicidle

+0

細胞。私はそれらのいくつかを読むだけにする必要があります。 – Ant4r

答えて

0

列を読み取り専用にする:

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

編集:あなたは、個々の行またはセルの編集を無効にするには、DataTriggerStyleを使用することができます。

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

おかげで、それは良いスタートになるかもしれませんが、より正確には私はいくつかのセルを読み込み専用にする必要があります。 – Ant4r

+0

どの細胞ですか?特定のセルを読み込み専用にする必要があるかどうかをどのように知っていますか? – mm8

+0

私がDatatableを満たすデータは、 "isEditable"という名前のブール属性を持っています。ですから、私は列や行を読み取り専用にする必要はありませんが、より正確にはセルを読み取る必要はありません。 – Ant4r

関連する問題