Wpf MVVM-设置具有DataGrid的ControlTemplate时出现NullReferenceException
在我的一个视图中,我将ContentControl绑定到同一页面中定义为资源的DataTemplate。在它里面,通过设置dataTemplate触发器中声明的绑定属性,我在运行时用不同的controlTemplates(四个)填充了一个控件:Wpf MVVM-设置具有DataGrid的ControlTemplate时出现NullReferenceException,wpf,mvvm,datagrid,datatemplate,Wpf,Mvvm,Datagrid,Datatemplate,在我的一个视图中,我将ContentControl绑定到同一页面中定义为资源的DataTemplate。在它里面,通过设置dataTemplate触发器中声明的绑定属性,我在运行时用不同的controlTemplates(四个)填充了一个控件: <DataTemplate x:Key="DeviceSetupDataTemplate"> <Control x:Name="theControl" Template="{DynamicResource Ban
<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>
。。。以及我的网格中的内容控件:
<ContentControl ContentTemplate="{DynamicResource DeviceSetupDataTemplate}" Margin="5" />
在我的两个ControlTemplates中,我有一个DataGrid,绑定到我的自定义对象列表(这里有一个):
现在的问题是:在视图上,我有四个按钮通过命令连接到viewModel,在它里面是回调,我在回调中更改属性的bool值以更改控件模板。
有时,似乎是随机的,当我将布尔属性设置为true以显示datagrid中包含的controltemplate时,出现了NullReferenceException。
此外,在异常的stacktrace中,我找到了对DataGridCellItemAutomationPeer的引用。。。我认为这是一个很好的调查起点,但我真的不知道该怎么做
谢谢你的帮助。找到了
我真的没有解释为什么,但是如果我在更改DataTemplate之前将DataGrid的IsEnabled属性设置为false,我不会得到任何异常
因此,我只是将一个绑定放在datagrid的IsEnabled上,在更改为其他ControlTemplate之前,我将属性设置为false,然后在命令回调结束时设置为true
L.我现在发现,如果在更改控制模板时选择一行datagrid,问题就会系统地出现。。。
<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>