如何从控件中删除ControlTemplate

时间:2014-01-30 08:33:40

标签: c# wpf datagrid controltemplate

我在UserControl.Resources中声明了一个ControlTemplate。所以我知道如何将控件添加到我的控件(在本例中为DataGrid),如下所示:

MyDataGrid.Template = (ControlTemplate)this.FindResource("inputItemsControlTemplate");

现在我想在代码中删除此ControlTemplate。实际上我正在尝试管理的是将DataGrid的外观更改为之前的状态,就像在此代码行之前一样。

更新

好的,我试着尽可能简单,但我会在这里描述完整的内容。我有一个datagrid定义了所有的绑定和事件处理程序和所有其他东西。我也在我的中定义了ControlTemplate。这个ControlTemplate实际上是一个用于向datagrid插入新数据的表单。这是我的模板的代码:

<ControlTemplate x:Key="inputItemsControlTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="120"/>
                <ColumnDefinition Width="200"/>
                <ColumnDefinition Width="200"/>
            </Grid.ColumnDefinitions>
            <Grid Grid.Column="0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                </Grid.RowDefinitions>
                <Label Grid.Row="1" Content="{DynamicResource UCodeStr}" HorizontalAlignment="Left" VerticalAlignment="Bottom" Height="27" />
                <TextBox Name="txtUCode" Grid.Row="2" Height="23" HorizontalAlignment="Left" VerticalAlignment="Bottom"  Width="100" Text="{Binding UCode, UpdateSourceTrigger=PropertyChanged}" />
            </Grid>
            <Grid Grid.Column="1">
                <Grid.RowDefinitions>
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                </Grid.RowDefinitions>
                <Label Grid.Row="1" Content="{DynamicResource GoodStr}" HorizontalAlignment="Left" VerticalAlignment="Bottom" Height="27"/>
                <ComboBox Grid.Row="2" Height="23" Width="189" HorizontalAlignment="Left"  Name="cbGoods" ItemsSource="{Binding Path=Goods}"  SelectedItem="{Binding Path= Good, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Name" IsEditable="True" IsTextSearchEnabled="True" TextSearch.TextPath="Name" />
                <Label Grid.Row="3" Content="{DynamicResource AmmountStr}" HorizontalAlignment="Left" Name="lblAmmount" VerticalAlignment="Bottom" Height="27"/>
                <TextBox Name="txtAmmount" TextAlignment="Right"  Grid.Row="4" Height="23" Width="189" HorizontalAlignment="Left" VerticalAlignment="Bottom" Text="{Binding Path=Amount,  ValidatesOnDataErrors=True, NotifyOnValidationError=True,  UpdateSourceTrigger=PropertyChanged, StringFormat='N2'}" />
            </Grid>
            <Grid Grid.Column="2">
                <Grid.RowDefinitions>
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                    <RowDefinition Height="25" />
                </Grid.RowDefinitions>
                <Label Grid.Row="1" Content="{DynamicResource InputPriceStr}" HorizontalAlignment="Left" Name="lblInputPrice" VerticalAlignment="Bottom" Height="27"/>
                <TextBox Name="txtInputPrice" Grid.Row="2" TextAlignment="Right" Height="23" Width="189" HorizontalAlignment="Left" VerticalAlignment="Bottom" Text="{Binding Path= InputPrice, UpdateSourceTrigger=PropertyChanged,  ValidatesOnDataErrors=True, NotifyOnValidationError=True, StringFormat='N2'}" />
                <Label Grid.Row="3" Content="{DynamicResource SuggestedPriceStr}" HorizontalAlignment="Left" Name="lblSuggestedPrice" VerticalAlignment="Bottom" Height="27"/>
                <TextBox Name="txtSuggestedPrice" Grid.Row="4" TextAlignment="Right" Height="23" Width="189" HorizontalAlignment="Left" VerticalAlignment="Bottom" Text="{Binding Path= SuggestedPrice,  ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, StringFormat='N2'}" />
                <CheckBox Grid.Row="5" Name="cbHasVatDeduction"  IsChecked="{Binding Path=HasVatDeduction}" />
            </Grid>
        </Grid>
    </ControlTemplate>

我有一些添加按钮。在它的Click事件处理程序中我这样做:

MyDataGrid.Template = (ControlTemplate)this.FindResource("inputItemsControlTemplate");

我得到的效果是我的DataGrid被替换为那些文本框和组合框用于插入新数据。我想要做的是切换回我的默认数据网格外观而不使用其他模板。我现在正在这样做但是因为我的数据网格中的事件对我不利。这是我的datagrid的代码:

<DataGrid AutoGenerateColumns="False"
                                      IsReadOnly="True"
                                      Name="InputDocItemsDataGrid"
                                      ItemsSource="{Binding Path= InputItems}" 
                                      SelectedItem="{Binding Path= InputItem, UpdateSourceTrigger=PropertyChanged}"
                                      SelectionChanged="InputDocItemsDataGrid_SelectionChanged"
                                      PreviewMouseLeftButtonDown="InputDocItemsDataGrid_PreviewMouseLeftButtonDown">
                            <DataGrid.Columns>
                                <DataGridTemplateColumn CanUserReorder="False" CanUserResize="False">
                                    <DataGridTemplateColumn.HeaderTemplate>
                                        <DataTemplate>
                                            <CheckBox Name="cbxAll" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="cbxAll_Checked" />
                                        </DataTemplate>
                                    </DataGridTemplateColumn.HeaderTemplate>
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <CheckBox Name="cbxSingleRow" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" PreviewMouseLeftButtonDown="cbxSingleRow_PreviewMouseLeftButtonDown" />
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
                                <DataGridTextColumn Header="{DynamicResource StockStr}" Binding="{Binding Path= tblInputDoc.tblStock.Name}"  />
                                    <DataGridTextColumn Header="{DynamicResource UCodeStr}" Binding="{Binding Path= tblGood.UCode}" />
                                    <DataGridTextColumn Header="{DynamicResource GoodStr}" Binding="{Binding Path= tblGood.Name}" />
                                    <DataGridTextColumn Header="{DynamicResource AmmountStr}" Binding="{Binding Path= Amount, Converter={StaticResource moneyConverter}}" />
                                    <DataGridTextColumn Header="{DynamicResource InputPriceStr}" Binding="{Binding Path= InputPrice, Converter={StaticResource moneyConverter}}" />
                                    <DataGridTextColumn Header="{DynamicResource SuggestedPriceStr}" Binding="{Binding Path= SuggestedPrice, Converter={StaticResource moneyConverter}}" />
                                    <DataGridTextColumn Header="{DynamicResource InputValueStr}" Binding="{Binding Path= InputValue, Mode=OneWay, Converter={StaticResource moneyConverter}}" />
                                    <DataGridTextColumn Header="{DynamicResource VatBaseStr}" Binding="{Binding Path= VatBase, Mode=OneWay, Converter={StaticResource moneyConverter}}" />
                                    <DataGridTextColumn Header="{DynamicResource VatValueStr}" Binding="{Binding Path= VatValue, Mode=OneWay, Converter={StaticResource moneyConverter}}" />
                                    <DataGridTextColumn Header="{DynamicResource InputWithVatStr}" Binding="{Binding Path= InputPriceWithVat, Mode=OneWay, Converter={StaticResource moneyConverter}}" />

                                    <!--<DataGridTextColumn Header="Stock" Binding="{Binding Path= tblStock.Name}" />-->
                                </DataGrid.Columns>
                            </DataGrid>

我的第二个ControlTemplate的代码,用于切换到datagrid的上一个外观:

<ControlTemplate x:Key="baseDataGridTemplate">
        <DataGrid AutoGenerateColumns="False"
                                      IsReadOnly="True"
                                      Name="InputDocItemsDataGrid"
                                      ItemsSource="{Binding Path= InputItems}" 
                                      SelectedItem="{Binding Path= InputItem, UpdateSourceTrigger=PropertyChanged}"
                                      SelectionChanged="InputDocItemsDataGrid_SelectionChanged"
                                      PreviewMouseLeftButtonDown="InputDocItemsDataGrid_PreviewMouseLeftButtonDown">
            <DataGrid.Columns>
                <DataGridTemplateColumn CanUserReorder="False" CanUserResize="False">
                    <DataGridTemplateColumn.HeaderTemplate>
                        <DataTemplate>
                            <CheckBox Name="cbxAll" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </DataTemplate>
                    </DataGridTemplateColumn.HeaderTemplate>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox Name="cbxSingleRow" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Header="{DynamicResource StockStr}" Binding="{Binding Path= tblInputDoc.tblStock.Name}"  />
                <DataGridTextColumn Header="{DynamicResource UCodeStr}" Binding="{Binding Path= tblGood.UCode}" />
                <DataGridTextColumn Header="{DynamicResource GoodStr}" Binding="{Binding Path= tblGood.Name}" />
                <DataGridTextColumn Header="{DynamicResource AmmountStr}" Binding="{Binding Path= Amount, Converter={StaticResource moneyConverter}}" />
                <DataGridTextColumn Header="{DynamicResource InputPriceStr}" Binding="{Binding Path= InputPrice, Converter={StaticResource moneyConverter}}" />
                <DataGridTextColumn Header="{DynamicResource SuggestedPriceStr}" Binding="{Binding Path= SuggestedPrice, Converter={StaticResource moneyConverter}}" />
                <DataGridTextColumn Header="{DynamicResource InputValueStr}" Binding="{Binding Path= InputValue, Mode=OneWay, Converter={StaticResource moneyConverter}}" />
                <DataGridTextColumn Header="{DynamicResource VatBaseStr}" Binding="{Binding Path= VatBase, Mode=OneWay, Converter={StaticResource moneyConverter}}" />
                <DataGridTextColumn Header="{DynamicResource VatValueStr}" Binding="{Binding Path= VatValue, Mode=OneWay, Converter={StaticResource moneyConverter}}" />
                <DataGridTextColumn Header="{DynamicResource InputWithVatStr}" Binding="{Binding Path= InputPriceWithVat, Mode=OneWay, Converter={StaticResource moneyConverter}}" />

                <!--<DataGridTextColumn Header="Stock" Binding="{Binding Path= tblStock.Name}" />-->
            </DataGrid.Columns>
        </DataGrid>
    </ControlTemplate>

我真的希望你明白我要做的事情。我不能比这更具体,我想避免问题中的代码量。如果这还不够,则应删除该问题。

2 个答案:

答案 0 :(得分:0)

如果你想通过代码执行此操作,那么在分配自定义ControlTemplate之前请保存MyDataGrid让我们说

var defaultDataGrid = MyDataGrid;
//then
MyDataGrid.Template = (ControlTemplate)this.FindResource("baseDataGridTemplate");
//and when you want to change it back
MyDataGrid.Template = defaultDataGrid.Template

让我们知道它是怎么回事: - )

但说实话,你可以使用DataTriggers中的DataGrid Style

在xaml中执行此操作

答案 1 :(得分:0)

我不知道你在说什么似乎你在wpf的世界里迷失了方向:)

看看这个:

this.previousTemplate = MyDataGrid.Template;
MyDataGrid.Template = (ControlTemplate)this.FindResource("baseDataGridTemplate");

然后在某个时候......

MyDataGrid.Template = previousTemplate;