更改模板内元素的绑定

本文关键字:元素 绑定 | 更新日期: 2023-09-27 18:12:09

我有一个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},以便我可以将模板应用于不同的列。

我该怎么做?

更改模板内元素的绑定

代替

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

如果我能很好地理解你的想法,这应该行得通。