2016-10-09 2 views
0

У меня есть DataGrid, где различные элементы в строке могут быть доступны для редактирования или только для чтения.Изменение привязки элемента внутри шаблона

Если бы я имел одну ячейку, которую необходимо сделать только для чтения по желанию, я хотел бы использовать что-то вроде

<DataGrid.Resources> 
    <!-- the non-editing cell --> 
    <DataTemplate x:Key="ReadonlyCellTemplate"> 
     <TextBlock Text="{Binding UserName}" /> 
    </DataTemplate> 

    <!-- the editing cell --> 
    <DataTemplate x:Key="EditableCellTemplate"> 
     <TextBox Text="{Binding UserName}" /> 
    </DataTemplate> 
</DataGrid.Resources> 

И чем я бы применить этот шаблон к колонку моего выбора.

<DataGridTemplateColumn CellTemplate="{StaticResource ReadonlyCellTemplate}" Header="User name"> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <!-- the additional layer of content presenter --> 
      <ContentPresenter x:Name="Presenter" Content="{Binding}" ContentTemplate="{StaticResource ReadonlyCellTemplate}" /> 
      <DataTemplate.Triggers> 
       <!-- dynamically switch the content template by IsEditable binding --> 
       <DataTrigger Binding="{Binding CreationFieldsEditable}" Value="True"> 
        <Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource EditableCellTemplate}" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

Я хочу, чтобы иметь возможность изменить {Binding UserName} внутри шаблона, так что я могу применить шаблон к различным столбцам.

Как это сделать?

+0

Если вы имеете в виду изменение свойства привязки, например вместо Text = "{Binding UserName1}" в Text = "{Binding UserName2}", я обычно делаю в этих случаях изменение самого элемента с помощью триггера данных. Если я хорошо понял условия, я могу дать детали для решения. –

ответ

2

вместо

<DataTemplate x:Key="EditableCellTemplate"> 
    <TextBox Text="{Binding UserName}" /> 
</DataTemplate> 

вам необходимо расширить шаблон:

<DataTemplate x:Key="t1"> 
     <TextBox Text="{Binding UserName1}" /> 
    </DataTemplate> 
    <DataTemplate x:Key="t2"> 
     <TextBox Text="{Binding UserName2}" /> 
    </DataTemplate> 
    <DataTemplate x:Key="EditableCellTemplate"> 
     <ContentPresenter x:Name="ctp" /> 

     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding MyProperty}" 
         Value="1"> 
       <Setter TargetName="ctp" 
         Property="ContentTemplate" 
         Value="{StaticResource t1}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding MyProperty}" 
         Value="2"> 
       <Setter TargetName="ctp" 
         Property="ContentTemplate" 
         Value="{StaticResource t2}" /> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 

Это должно работать, если я понимаю вашу идею хорошо.

Смежные вопросы