2012-10-25 3 views
0

내보기 중 하나에서 동일한 페이지의 리소스로 정의 된 DataTemplate에 ContentControl이 바인딩되어 있습니다.MVVM - DataGrid가있는 ControlTemplate을 설정하면 NullReferenceException이 발생합니다.

<DataTemplate x:Key="DeviceSetupDataTemplate"> 
     <Control x:Name="theControl" Template="{DynamicResource BanknotesReaderControlTemplate}" /> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding DeviceSetup.ShowBanknotesReaderControlTemplate, Source={StaticResource Locator}}" Value="true" > 
       <Setter TargetName="theControl" Property="Template" Value="{DynamicResource BanknotesReaderControlTemplate}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding DeviceSetup.ShowCoinsReaderControlTemplate, Source={StaticResource Locator}}" Value="true" > 
       <Setter TargetName="theControl" Property="Template" Value="{DynamicResource CoinsReaderControlTemplate}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding DeviceSetup.ShowHoppersControlTemplate, Source={StaticResource Locator}}" Value="true" > 
       <Setter TargetName="theControl" Property="Template" Value="{DynamicResource HoppersControlTemplate}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding DeviceSetup.ShowCoinsCashBoxControlTemplate, Source={StaticResource Locator}}" Value="true" > 
       <Setter TargetName="theControl" Property="Template" Value="{DynamicResource CoinsCashBoxControlTemplate}" /> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 

... 내 격자 내부의 콘텐츠 컨트롤 :

안에, 내가 DataTemplate을의 트리거에 선언 된 바인딩 속성을 설정하여 다른 controlTemplates (4 개)와 런타임에 가득 제어 할 수 있습니다

<ControlTemplate x:Key="BanknotesReaderControlTemplate" TargetType="{x:Type Control}"> 
     <Grid d:DesignWidth="772.02" d:DesignHeight="532.76" Margin="15,0"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="0.08*" /> 
       <RowDefinition Height="0.1*" /> 
       <RowDefinition Height="0.1*" /> 
       <RowDefinition Height="0.1*" /> 
       <RowDefinition Height="0.1*" /> 
       <RowDefinition Height="0.08*" /> 
       <RowDefinition Height="0.44*" /> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="35*" /> 
       <ColumnDefinition Width="40*" /> 
       <ColumnDefinition Width="25*" /> 
      </Grid.ColumnDefinitions> 
      <StackPanel Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="3" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center" > 
       <Button Margin="0,3,10,3" Command="{Binding DeviceSetup.AddBanknoteType, Mode=OneWay, Source={StaticResource Locator}}" Content="{DynamicResource 442}" Width="85" Style="{DynamicResource DeviceSetupButtonStyle}" Height="Auto" Padding="2,1" /> 
       <Button Margin="0,3,10,3" Command="{Binding DeviceSetup.ChangeBanknoteType, Mode=OneWay, Source={StaticResource Locator}}" Content="{DynamicResource 444}" Width="85" Style="{DynamicResource DeviceSetupButtonStyle}" Padding="2,1" /> 
       <Button Margin="0,3" Command="{Binding DeviceSetup.DeleteBanknoteType, Mode=OneWay, Source={StaticResource Locator}}" Content="{DynamicResource 443}" Width="85" Style="{DynamicResource DeviceSetupButtonStyle}" Height="Auto" Padding="2,1" /> 
      </StackPanel> 
      <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Top" HorizontalContentAlignment="Center" AutoGenerateColumns="False" ScrollViewer.VerticalScrollBarVisibility="Hidden" Grid.Row="6" Grid.ColumnSpan="3" Margin="0,5" 
         ItemsSource="{Binding DeviceSetup.BanknotesDetails, Source={StaticResource Locator}}" SelectedItem="{Binding DeviceSetup.SelectedBanknoteDetails, Source={StaticResource Locator}}" > 
       <DataGrid.Columns> 
        <DataGridCheckBoxColumn Binding="{Binding IsEnabled}" Width="5*" /> 
        <DataGridTextColumn Binding="{Binding Value}" IsReadOnly="True" Header="{DynamicResource 445}" Width="20*" ElementStyle="{DynamicResource SmallSizedTextBlockBlackPlusMatic}" /> 
        <DataGridTextColumn Binding="{Binding Currency}" IsReadOnly="True" Header="{DynamicResource 446}" Width="25*" ElementStyle="{DynamicResource SmallSizedTextBlockBlackPlusMatic}" /> 
        <DataGridTextColumn Binding="{Binding MoneyCode}" IsReadOnly="True" Header="{DynamicResource 447}" Width="50*" ElementStyle="{DynamicResource SmallSizedTextBlockBlackPlusMatic}" /> 
       </DataGrid.Columns>  
      </DataGrid> 
     </Grid>  
    </ControlTemplate> 

그리고 지금 문제 : 나는 데이터 그리드를 내 ControlTemplates 두에서

<ContentControl ContentTemplate="{DynamicResource DeviceSetupDataTemplate}" Margin="5" /> 

, 내 사용자 지정 개체의 목록에 경계 (여기에 하나있다)보기에 나는이 네 개의 버튼은 viewModel에 명령으로 연결되어 있고 그 안에 콜백 (callBack)이 있습니다. 여기서 컨트롤 템플릿을 변경하기 위해 속성의 bool 값을 변경합니다. 가끔 무작위로 보입니다. DataGrid 내부에있는 controltemplate을 표시하기 위해 부울 속성을 true로 설정하면 NullReferenceException이 발생합니다. MoreOver 예외의 스택 추적 내에서 DataGridCellItemAutomationPeer에 대한 참조를 발견했습니다 ...이 조사의 시작점이 될 수는 있지만 근본적으로 어떻게 해야할지 모릅니다.

진심으로 감사드립니다 ...

+0

컨트롤 템플릿을 변경할 때 DataGrid의 행을 선택하면 문제가 체계적으로 발생하는 것으로 나타났습니다 ... – zero51

답변

0

FOUND !!

정말 이유를 설명하지 않지만 DataGrid의 IsEnabled 속성을 false로 설정하여 DataTemplate을 변경하기 전에 예외가 발생하지 않습니다.

그래서 단순히 DataGrid의 IsEnabled에 바인딩을 지정하고 다른 ControlTemplate으로 변경하기 전에 속성을 false로 설정 한 다음 명령의 콜백 끝에 true로 설정합니다.

L.

관련 문제