WINUI 3 Datagrid,IsReadOnly 按行设置?

WINUI 3 Datagrid, IsReadOnly setting by row?

提问人:CloudFrugality 提问时间:11/13/2023 更新时间:11/13/2023 访问量:46

问:

我在 WINUI 3 应用程序中使用社区工具包数据网格。我可以设置列的“IsReadOnly”属性,并使该列不可编辑。但我想做的是将整个数据网格设置为只读,然后用户选择一行,单击编辑按钮,只有该行是可编辑的。据我所知,这是不可能的。或者我是个白痴。两者都是可能的。

我似乎找不到任何在线材料说这是可能的。列 readonly 确定,但不是行。

C# XAML WinUI-3 Windows-社区工具包

评论


答:

0赞 Andrew KeepCoding 11/13/2023 #1

一种方法是创建一个只读标志:

人员.cs

public partial class Person : ObservableObject
{
    [ObservableProperty]
    private int _id;

    [ObservableProperty]
    private string? _name;

    [ObservableProperty]
    private bool _isReadOnly;
}

MainPageViewModel.cs

public partial class MainPageViewModel : ObservableObject
{
    [ObservableProperty]
    private ObservableCollection<Person> _people = new()
    {
        new Person { Id = 1, Name = "Michael", IsReadOnly = true },
        new Person { Id = 2, Name = "Jim", IsReadOnly = true },
        new Person { Id = 3, Name = "Pam", IsReadOnly = true },
        new Person { Id = 4, Name = "Dwight", IsReadOnly = true },

    };

然后,您可以:

MainPage.xaml.cs

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    public MainPageViewModel ViewModel { get; } = new();
}

MainPage.xaml

<toolkit:DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{x:Bind ViewModel.People, Mode=OneWay}">
    <toolkit:DataGrid.Columns>
        <toolkit:DataGridTextColumn
            Binding="{Binding Id}"
            Header="ID"
            IsReadOnly="True" />
        <toolkit:DataGridTemplateColumn Header="Name">
            <toolkit:DataGridTemplateColumn.CellTemplate>
                <DataTemplate x:DataType="local:Person">
                    <TextBox
                        Background="Transparent"
                        BorderBrush="Transparent"
                        BorderThickness="0"
                        CornerRadius="0"
                        IsReadOnly="{x:Bind IsReadOnly, Mode=OneWay}"
                        Text="{x:Bind Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </toolkit:DataGridTemplateColumn.CellTemplate>
        </toolkit:DataGridTemplateColumn>
        <toolkit:DataGridTemplateColumn Header="Read only">
            <toolkit:DataGridTemplateColumn.CellTemplate>
                <DataTemplate x:DataType="local:Person">
                    <CheckBox IsChecked="{x:Bind IsReadOnly, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </toolkit:DataGridTemplateColumn.CellTemplate>
        </toolkit:DataGridTemplateColumn>
    </toolkit:DataGrid.Columns>
</toolkit:DataGrid>

注意:我正在使用 CommunityToolkit.Mvvm NuGet 包。