.NET 6 WinUI 3 社区工具包 Datagrid 复选框导致崩溃

问题描述 投票:0回答:0

我在页面中有一个从按钮调用的内容对话框,当我向它添加

DataGridCheckBoxColumn
时,我注意到一些奇怪的崩溃行为。如果我添加一个
DataGridCheckBoxColumn
,在我连续第四次打开内容对话框时,应用程序将在从按钮(见下文)调用的
ContentDialogResult result = await assignUsersContentDialog.ShowAsync();
行崩溃。

但是,如果我添加两个

DataGridCheckBoxColumn
并连续打开内容对话框两次,它就会崩溃。如果我从数据网格中删除绑定或
DataGridCheckBoxColumn
,它将不再崩溃。我怀疑这可能是因为微软的
DataGridCheckBoxColumn
有问题,在任何一种情况下都不会显示复选框。

但也许我的代码以某种方式导致了崩溃。我看了一遍又一遍,找不到罪魁祸首,但也许你可以?

XAML 作为页面的一部分:

<ContentDialog x:Name="ContentDialogTest" Width="1100"
   PrimaryButtonText="Accept" IsPrimaryButtonEnabled="True" PrimaryButtonClick="assignUsersContentDialog_PrimaryButtonClick"
   CloseButtonText="Cancel" >
    <StackPanel>
        <controls:DataGrid x:Name="dataGridTest" 
                Margin="12" GridLinesVisibility="All" HorizontalGridLinesBrush="PowderBlue" VerticalGridLinesBrush="PowderBlue"
                BorderBrush="PowderBlue" ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                AutoGenerateColumns="False"
                ItemsSource="{x:Bind ViewModel.AssignUsersGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <controls:DataGrid.Columns>
                <controls:DataGridCheckBoxColumn IsReadOnly="True" 
                    Header="Add User" 
                    Width="75" />
                <controls:DataGridCheckBoxColumn IsReadOnly="True" 
                    Header="Add User 2" 
                    Width="75" />
                <!--a couple of DataGridTextColumns not shown-->
            </controls:DataGrid.Columns>
        </controls:DataGrid>
    </StackPanel>
</ContentDialog>

显示内容对话框的按钮事件:

    private async void AddEditAssignUsers_Click(object sender, RoutedEventArgs e)
    {
        ViewModel.SetAssignUsersGrid();

        ContentDialogResult result = await assignUsersContentDialog.ShowAsync();           
    }

设置绑定到数据网格的可观察集合的代码:

private void SetAssignUsersGrid()
{
        //Limit Global ProjectDbUser list to those from the current project
        IEnumerable<ProjectDbuser> projUsers = _UnitOfWorkDbGlobal.ProjectDbUsers.GetAllUsersFromProject(SelectedDataGrProj.ProjectDbguid);

        //limit UserAd to users not currenlty in the project
        IEnumerable<UserAd> userAds = _UnitOfWorkDbGlobal.UserAds.GetAll().Where(ad => !projUsers.Any(p => ad.UserAdguid == p.UserAdguid)).OrderBy(x => x.UserAddisplayName).ToList();

        List<TempUser> assign = new List<TempUser>();
        foreach (UserAd ua in userAds)
        {
            TempUser tu = new TempUser().Clean();
            tu.Selected = false;
            tu.UserAdguid = ua.UserAdguid;
            tu.UserAddisplayName = ua.UserAddisplayName;
            tu.UserAdfirstName = ua.UserAdfirstName;
            tu.UserAdmiddleInitial = ua.UserAdmiddleInitial;
            tu.UserAdlastName = ua.UserAdlastName;
            assign.Add(tu);
        }

        AssignUsersGrid = new ObservableCollection<TempUser>(assign);
}
c# xaml datagrid .net-6.0 winui-3
© www.soinside.com 2019 - 2024. All rights reserved.