2014-01-30 1 views
0

ControlTemplate을 UserControl.Resources에 선언했습니다. 그래서 나는이 같은 내 컨트롤 (이 경우 데이터 그리드)에 해당 컨트롤을 추가하는 방법을 알고 컨트롤에서 ControlTemplate을 제거하는 방법

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> 

일부 추가 버튼이 있습니다. 이 이벤트 처리기를 클릭 년대에 나는이 작업을 수행 :이로 얻는 효과는 내 데이터 그리드가 새로운 데이터를 삽입하는 텍스트 상자와 콤보 상자로 대체됩니다

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의 코드 : 여기 내 데이터 그리드의 코드

<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

여기에 문제의 자세한 내용을 추가하십시오 당신이 그와 함께 달성하고자 실제로 무엇을. ControlTemplate을 제거하는 대신 우아한 해결책이있을 수도 있습니다. –

+0

Ok 질문을 업데이트했습니다. – Stojdza

답변

0

DataTriggers를 사용하여 XAML에서이 작업을 수행 할 수 있습니다 :

이것 좀 봐 :

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

후 어느 시점 이후에

...

MyDataGrid.Template = previousTemplate; 
+0

그게 전부입니다. MyDataGrid.Template 같은 컨트롤 템플릿에 액세스 할 수 있다는 것을 알지 못했습니다! 나는 내가 작성한 코드에서 다른 것을 만들 필요가 있다고 생각했다. 감사. – Stojdza

+0

yw, 차 또는 무엇인가의 이름인가? –

+0

그냥 별명 :) – Stojdza

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 

이 알려 가정 해 봅시다 그러나 완벽하게 정직하게 당신은 것에 대해 당신이 WPF의 세계에서 슈퍼 손실 얻었다처럼 당신이 말하는 무슨 생각이 없다 DataGrid Style

관련 문제