.NET 6 WinUI 3 社区工具包 Datagrid 以编程方式更新单元格值

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

我有一个带按钮的社区工具包数据网格。单击按钮会触发一个事件,该事件调用一个方法来更新绑定到按钮文本的

Selected
属性。绑定项是
SelectedAssignUsersGrid
属性绑定到数据网格的
SelectedItem
.

我的目标是一旦

Selected
属性以编程方式更改,按钮的文本将在数据网格 UI 中更新。问题是在大多数情况下,当属性发生变化时它不会改变,但这很古怪。如果我双击该按钮,它有时会发生变化,但并不总是与实际属性值匹配。数据网格是古怪到无可救药的地步,还是有办法让 UI 在绑定属性发生变化时与它们匹配?

XAML 数据网格:

            <controls:DataGrid x:Name="dataGridAssignUsers_Temp" 
                    Margin="12" GridLinesVisibility="All" HorizontalGridLinesBrush="PowderBlue" VerticalGridLinesBrush="PowderBlue"
                    BorderBrush="PowderBlue" ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                    AutoGenerateColumns="False" 
                    SelectedItem="{x:Bind ViewModel.SelectedAssignUsersGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                    ItemsSource="{x:Bind ViewModel.AssignUsersGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                <controls:DataGrid.Columns>
                    
                    <controls:DataGridTemplateColumn Header="Select" Width="75">
                        <controls:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate x:DataType="viewmodels:ProjectViewModel">
                                <Grid>
                                    <Button Click="DataGridAssignUserSelect_Click"  HorizontalContentAlignment="Left" 
                                            VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                                        <TextBlock>                                                        
                                            <Run FontSize="12" Text="{Binding Selected,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                                        </TextBlock>
                                    </Button>
                                </Grid>
                            </DataTemplate>
                        </controls:DataGridTemplateColumn.CellTemplate>
                    </controls:DataGridTemplateColumn>
                  
                    <controls:DataGridTextColumn   IsReadOnly="True"
                        Header="AD User Name" 
                        Width="250"
                        Binding="{Binding UserAdazureAduserName}" 
                        FontSize="14" />
                    <controls:DataGridTextColumn   IsReadOnly="False"
                        Header="User Initials" 
                        Width="250"
                        Binding="{Binding AppUserInitials}" 
                        FontSize="14" />
                </controls:DataGrid.Columns>                        
            </controls:DataGrid>

代码隐藏事件:

    private void DataGridAssignUserSelect_Click(object sender, RoutedEventArgs e)
    {           
        ViewModel.SelectAssignableUser();
        dataGridAssignUsers.UpdateLayout();
    }

ViewModel 从上面的事件中调用的代码:

public partial class ProjectViewModel : ObservableObject, IDisposable
{
    ...

    [ObservableProperty]
    private ObservableCollection<TempUser> _assignUsersGrid; //Project users datagrid source.

    [ObservableProperty]
    public TempUser _selectedAssignUsersGrid = new(); //Item selected in the datagrid.

    public void SelectAssignableUser()
    {
        if (SelectedAssignUsersGrid is null) return;
        SelectedAssignUsersGrid.Selected = !SelectedAssignUsersGrid.Selected;
    }
    ...
}

作为参考,这里是网格绑定的底层模型类:

public class TempUser
{
    public bool Selected { get; set; }
    public string AppUserInitials { get; set; }
    public string UserAdazureAduserName { get; set; }

    public TempUser() { }
}
c# datagrid winui-3 windows-community-toolkit
© www.soinside.com 2019 - 2024. All rights reserved.