0

私のビューの 1 つで、同じページのリソースとして定義された DataTemplate にバインドされた ContentControl があります。その中に、dataTemplate のトリガーで宣言されたバインドされたプロパティを設定することにより、実行時にさまざまな controlTemplates (4) で満たされたコントロールがあります。

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

2 つの ControlTemplates には、カスタム オブジェクトの List にバインドされた DataGrid があります (ここにそのうちの 1 つがあります)。

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

そして今問題: ビューには、コマンドによって viewModel に接続された 4 つのボタンがあり、その中に callBack プロパティの bool 値を変更してコントロール テンプレートを変更します。データグリッド内にあるコントロール テンプレートを表示するためにブール値プロパティを true に設定すると、ランダムに見えることがありますが、NullReferenceException が発生しました。さらに、例外のスタックトレース内で、DataGridCellItemAutomationPeer への参照を見つけました...これは調査の出発点として適していると思いますが、どうすればよいかわかりません。

よろしくお願いします..

4

1 に答える 1

0

見つかった!!

理由は説明しませんが、DataTemplate を変更する前に DataGrid の IsEnabled プロパティを false に設定すると、例外は発生しません。

したがって、データグリッドの IsEnabled へのバインディングを配置し、別の ControlTemplate に変更する直前に、プロパティを false に設定し、コマンドのコールバックの最後で true に設定しました。

L.

于 2012-10-25T13:46:05.033 に答える