1

我有一个奇怪的情况,我不知道如何处理......在我的项目中,我有以下 TreeView,它在其 TreeViewItem 中包含复选框:

<DataGrid x:Name="dataGridVirtualMachinesInfo" ItemsSource="{Binding Path=SelectedItem.VMImagesInfo, ElementName=comboBoxUserName}"
                      Style="{DynamicResource RoundDataGridStyle}" RowDetailsVisibilityChanged="dataGridVirtualMachinesInfo_RowDetailsVisibilityChanged"
                      MouseLeftButtonUp="DataGrid_MouseLeftButtonUp" CanUserAddRows="False" Margin="24" AutoGenerateColumns="False" ClipToBounds="True"
                      AreRowDetailsFrozen="false" CanUserResizeRows="False" RowDetailsTemplate="{DynamicResource VMRowDetailsDataTemplate}"
                      Visibility="Visible" Background="White" VerticalAlignment="Top">
                <DataGrid.Resources>
                    <DataTemplate x:Key="VMRowDetailsDataTemplate">
                        <Border BorderThickness="2">
                            <Border.BorderBrush>
                                <SolidColorBrush Color="{DynamicResource ColorBorder}"/>
                            </Border.BorderBrush>
                            <Grid x:Name="gridRowDetail" Height="450" Width="Auto" Margin="0" Background="White" VerticalAlignment="Stretch" >
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="2*"/>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="10*"/>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="5*"/>
                                </Grid.RowDefinitions>
                                <Grid x:Name="gridCurrentVersion" Margin="0" Grid.RowSpan="1" Grid.Row="0">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Label x:Name="lableCurrentVersion" Content="Current Version : " HorizontalAlignment="Left"
                                           Margin="5,0,0,0" VerticalAlignment="Center" Width="Auto" FontWeight="Bold"/>
                                    <TextBox x:Name="textBoxCurrentVersion" Text="{Binding CurrentVersion}" HorizontalAlignment="Left"
                                             Margin="105,0,0,0" TextWrapping="Wrap"  VerticalAlignment="Center" RenderTransformOrigin="0.432,0.365"
                                             Width="100" Height="Auto" Grid.Column="0" AcceptsReturn="True"/>
                                    <Button x:Name="buttonRestoreDefaults" Content="Restore Defaults" HorizontalAlignment="Right"
                                            Margin="0,2,95,2" VerticalAlignment="Center" Width="90" RenderTransformOrigin="0.213,-0.401" Grid.Column="0"
                                            d:LayoutOverrides="HorizontalAlignment, GridBox" Height="30" Grid.ColumnSpan="2"/>
                                    <Button x:Name="buttonSaveInfo" Content="Save Info" Click="buttonSaveInfo_Click" Width="90"
                                            Background="#FF2DD420"  Margin="0,2" HorizontalAlignment="Right" Height="30"
                                            VerticalAlignment="Center" RenderTransformOrigin="1.125,0.599" Grid.Column="1"/>
                                </Grid>
                                <GridSplitter x:Name="gridSplitterCurrVerAndSaveInfoButton" 
                                    ResizeDirection="Rows" 
                                    Grid.Column="0" 
                                    Grid.ColumnSpan="2" 
                                    Grid.Row="1" 
                                    Width="Auto" 
                                    Height="3" 
                                    HorizontalAlignment="Stretch" 
                                    VerticalAlignment="Stretch" 
                                    Margin="0">
                                    <GridSplitter.Background>
                                        <SolidColorBrush Color="{DynamicResource ColorBorder}"/>
                                    </GridSplitter.Background>
                                </GridSplitter>
                                <Grid x:Name="gridFeaturesAndProps" Margin="0" Grid.Row="2">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="3*"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid x:Name="gridFeatures">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="2*"/>
                                            <RowDefinition Height="15*"/>
                                        </Grid.RowDefinitions>
                                        <Label x:Name="lableFeaturesSelection" Content="Features Selection" HorizontalAlignment="Left"
                                               VerticalAlignment="Top" FontWeight="Bold" Grid.Row="0" Margin="5,0,0,0"/>
                                        <TreeView x:Name="GroupViewFeaturesList" ItemsSource="{Binding Path=InstallPackage.Features.FeaturesTree}"
                                              ItemContainerStyle="{DynamicResource  TreeViewItemStyle}"
                                              Margin="5,0,0,5" FontFamily="Pescadero" BorderThickness="0" FontSize="13.333"
                                              Width="Auto" Height="Auto" Grid.Row="1" VerticalAlignment="Stretch" d:LayoutOverrides="GridBox">
                                            <TreeView.Resources>
                                                <Style x:Key="TreeViewItemStyle" TargetType="{x:Type TreeViewItem}">
                                                    <!--<Setter Property="Visibility" Value="{Binding Path=IsVisible, Mode=TwoWay, Converter={StaticResource boolToVis}}" />-->
                                                    <Setter Property="IsExpanded" Value="True" />
                                                </Style>
                                                <HierarchicalDataTemplate DataType="{x:Type nsMsiObjects:Feature}" ItemsSource="{Binding SubFeatures}">
                                                    <CheckBox x:Name="checkBoxFeatureSelection" Content="{Binding DisplayName}" Checked="checkBoxFeatureSelection_Checked"/>
                                                </HierarchicalDataTemplate>
                                            </TreeView.Resources>
                                            <TreeView.Background>
                                                <LinearGradientBrush EndPoint="1.204,0.5" StartPoint="0.056,0.5">
                                                    <GradientStop Color="White" Offset="1"/>
                                                    <GradientStop Color="#FFD4D7DB"/>
                                                </LinearGradientBrush>
                                            </TreeView.Background>
                                        </TreeView>
                                    </Grid>
                                    <GridSplitter x:Name="gridSplitterFeaturesAndInstallProps" 
                                        ResizeDirection="Rows" 
                                        Grid.Column="1" 
                                        Grid.RowSpan="2" 
                                        Grid.Row="0" 
                                        Width="3" 
                                        Height="Auto" 
                                        HorizontalAlignment="Stretch" 
                                        VerticalAlignment="Stretch" 
                                        Margin="4,0">
                                        <GridSplitter.Background>
                                            <SolidColorBrush Color="{DynamicResource ColorBorder}"/>
                                        </GridSplitter.Background>
                                    </GridSplitter>
                                    <Grid x:Name="gridInstallPropsAndExpendAdditionals" Margin="0" Grid.Column="2">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition/>
                                            <ColumnDefinition Width="Auto"/>
                                        </Grid.ColumnDefinitions>
                                        <Grid x:Name="gridInstallProps" Grid.Column="0" Margin="0" Width="Auto">
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="2*"/>
                                                <RowDefinition Height="15*"/>
                                            </Grid.RowDefinitions>
                                            <Label x:Name="lableInstallationProperties" Content="Installation Properties" HorizontalAlignment="Left"
                                                   Margin="0" d:LayoutOverrides="GridBox" Grid.Row="0" Grid.Column="0" FontWeight="Bold" VerticalAlignment="Top"/>
                                            <ScrollViewer Grid.Row="1">
                                                <StackPanel x:Name="StackPanelInstallProps" Width="Auto" Height="Auto">
                                                    <!--<nsProject:ExpanderInstallProperties x:Name="expanderInstallProps" />-->

                                                </StackPanel>
                                            </ScrollViewer>

                                        </Grid>
                                    </Grid>
                                </Grid>
                                <GridSplitter x:Name="gridSplitterFeaturesAndComments" 
                                    ResizeDirection="Rows" 
                                    Grid.Column="0" 
                                    Grid.ColumnSpan="2" 
                                    Grid.Row="3" 
                                    Width="Auto" 
                                    Height="3" 
                                    HorizontalAlignment="Stretch" 
                                    VerticalAlignment="Stretch" 
                                    Margin="0">
                                    <GridSplitter.Background>
                                        <SolidColorBrush Color="{DynamicResource ColorBorder}"/>
                                    </GridSplitter.Background>
                                </GridSplitter>
                                <Grid x:Name="gridComments" HorizontalAlignment="Stretch" Margin="0" Width="Auto" Grid.Row="4">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="2*"/>
                                        <RowDefinition Height="10*"/>
                                    </Grid.RowDefinitions>
                                    <Label x:Name="lableComments" Content="Comments :" HorizontalAlignment="Left"
                                           VerticalAlignment="Top" Width="Auto" FontWeight="Bold" Grid.Row="0" Grid.RowSpan="1"
                                           Margin="5,0,33.866,-200" d:LayoutOverrides="Width"/>
                                    <TextBox x:Name="textBoxComments" Text="{Binding UserComments}" Margin="5" TextWrapping="Wrap"
                                             VerticalAlignment="Stretch" Height="Auto" VerticalScrollBarVisibility="Auto" Grid.Row="1"
                                             BorderThickness="3" AcceptsReturn="True" MaxWidth="{Binding ActualWidth, ElementName=gridComments}"/>
                                </Grid>
                            </Grid>
                        </Border>
                    </DataTemplate>
                </DataGrid.Resources>
                <DataGrid.RowBackground>
                    <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                        <GradientStop Color="#FFB7CADE"/>
                        <GradientStop Color="#FF5F6264" Offset="1"/>
                    </LinearGradientBrush>
                </DataGrid.RowBackground>
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="dgTextColumnServerIP" Binding="{Binding VMServerIP}" Header="Server IP" IsReadOnly="True"/>
                    <DataGridTextColumn x:Name="dgTextColumnVMName" Binding="{Binding Name}" Header="Virtual Machine Name" IsReadOnly="True"/>
                    <DataGridTextColumn x:Name="dgTextColumnInstalledVersion" Binding="{Binding InstalledVersion}" Header="Installed Version"/>
                    <DataGridTemplateColumn x:Name="dgTemplateColumnUpgradeMajorVersion" Header="Upgrade Major Version">
                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <ComboBox x:Name="comboBoxMajorVersion" Height="Auto"
                                        SelectedIndex="0"
                                        ItemsSource="{Binding Path=InstallPackage.Versions,UpdateSourceTrigger=PropertyChanged}"
                                    />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox x:Name="comboBoxMajorVersion" Height="Auto"
                                          SelectedIndex="0"
                                    ItemsSource="{Binding Path=InstallPackage.Versions}"
                                    />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn x:Name="dgTemplateColumnUpgradeVersion" Header="Upgrade Version">
                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <ComboBox x:Name="comboBoxMinorVersion"
                                  SelectedIndex="0"
                                  ItemsSource="{Binding Path=SelectedItem.MinorBuildVersions, ElementName=comboBoxMajorVersion, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                  DisplayMemberPath="Version"
                                  SelectedValue="Version"
                                  SelectedValuePath="Version" 
                                  Margin="15,0,0,0" VerticalAlignment="Center" IsEditable="True" IsReadOnly="True"
                                  ToolTip="Choose user to display his virtual machines" Grid.Column="3" Width="220" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox x:Name="comboBoxMinorVersion"
                                  SelectedIndex="0"
                                  ItemsSource="{Binding Path=SelectedItem.Users, ElementName=comboBoxTeamName, UpdateSourceTrigger=PropertyChanged}"
                                  DisplayMemberPath="Name"
                                  SelectedValuePath="Name" 
                                  Margin="15,0,0,0" VerticalAlignment="Center" IsEditable="True" IsReadOnly="True"
                                  ToolTip="Choose user to display his virtual machines" Grid.Column="3" Width="220" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn x:Name="dgTemplateColumnUpgradeTypr" Header="Upgrade Type">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox Height="Auto" 
                                    ItemsSource="{StaticResource UpgradeTypeList}"
                                    SelectedItem="{Binding UpgradeType}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn x:Name="dgTemplateColumnExecuteUpgrade" Header="Execute Upgrade">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Style="{StaticResource GlassButton}" Content="Go!" Width="25" Height="25" Background="#FF2DD420"  Margin="2"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

但是,当我突然扩展我的数据网格的行时,抛出了一个没有源代码的 NullReferenceException,所以我看不到它是从哪里抛出的。我认为由于某种原因它会在我设置 TreeView ItemsSource 时在创建复选框之前触发事件

这是用于设置 TreeView ItemsSource 的附加代码:

/// <summary>
    /// This function occur when selecting one of the rows from dataGridVirtualMachinesInfo
    /// opening its row details and setting its inner controls
    /// </summary>
    private void dataGridVirtualMachinesInfo_RowDetailsVisibilityChanged(object sender, DataGridRowDetailsEventArgs e)
    {
        string path = "Some Path.msi";
        TreeView featuresTree = dataGridVirtualMachinesInfo.GetRowDetailsInnerControl<TreeView>("GroupViewFeaturesList");
        if (featuresTree.Items.IsEmpty)
        {
            // get the selected row of dataGridVirtualMachinesInfo
            DataGridRow dgRow = dataGridVirtualMachinesInfo.GetSelectedRow(dataGridVirtualMachinesInfo.SelectedItem);
            VMImageInfo selectedRowVmInfo = dgRow.DataContext as VMImageInfo;
            selectedRowVmInfo.InstallPackage = new InstallationPackage();
            selectedRowVmInfo.InstallPackage.SetFeatures(path);          DisplayFeaturesGroupedByFeatures(selectedRowVmInfo.InstallPackage.Features.DisplayedFeaturesList);
        }
    }

我该如何处理?我整天都在寻找答案,但找不到与此相关的东西

谢谢!

更新: 我已经按照您的要求添加了所有 DataGrid 及其详细信息另外您是对的,我不需要在后面的代码中设置 TreeView,所以我从那里删除了它并更改了 xaml 中的绑定路径。树视图是 DataGridRowDetails 模板的一部分 异常消息是:“对象引用未设置为对象的实例。” 由于源不可用,因此没有堆栈跟踪,可能发生在 xaml

再次感谢!

4

0 回答 0