我有一个使用CommunityToolkit.WinUI.UI.Controls.DataGrid的Winui3项目. 我把ObservableCollection<ExampleClass>DataGridBundle 在一起. ExampleClass的相关变量为:Amount int, Price int, TotalPrice int. 我向我的数据网格CellEditEnded添加了一个事件,它将TotalPrice更新为Amount * Price. 在用户在运行时更改数据网格中的AmountPrice之后,但是对于值TotalPrice的任何类型的更改,以下问题仍然存在. 在应用程序开始时,价格为==10.当用户将数量更改为2时,该ExampleClass实例的TotalPrice单元格仍然显示0(0数量*10价格).我已判断过,并且已在Observablecolect中正确更改了TotalPrice值.问题是DataGrid不会显示更改.当我重新加载页面时,更改终于正确完成.或者,当用户开始编辑TotalPrice单元格时,正确的值突然出现并停留在单元格中.有趣的是,当我try 手动更改总价格值时,它总是返回到正确的值.

在这个问题上,用户在编辑金额或价格后,总是必须开始编辑所有过时的总价格单元格才能看到正确的值.或者他重新加载页面以查看所有正确的值.

当单元格A(Amount或Price)更改时,DataGrid似乎不会更新单元格B(TotalPrice).

金额=数字,价格=价格

<controls:DataGrid 
    AutoGenerateColumns="False"
    GridLinesVisibility="Horizontal"
    ItemsSource="{x:Bind ViewModel.kgr.Tabelle1, Mode=OneWay}"
    Grid.Column="0"
    Grid.Row="0"
    CellEditEnded="DataGrid_CellEditEnded>
    <controls:DataGrid.Resources>
        <SolidColorBrush x:Key="DataGridColumnHeaderBackgroundColor" Color="Transparent" />
    </controls:DataGrid.Resources>
    <controls:DataGrid.Columns>
        <controls:DataGridTextColumn Binding="{Binding Name}" Header="Bereich" />
        <controls:DataGridTextColumn Binding="{Binding Anzahl}" Header="Fläche in m^2" />
        <controls:DataGridTextColumn Binding="{Binding Preis}" Header="€ pro m^2" />
        <controls:DataGridTextColumn Binding="{Binding TotalPreis}" Header="Gesamt"/>
        <!-- IsReadOnly="True" -->
    </controls:DataGrid.Columns>
</controls:DataGrid>

我将重点放在XAML文件上,因为数据源工作得很好. 在那里,我try 了celleditEvent的替代方法、itemsource中的绑定模式、itemsource中的其他XAML属性、datagrid本身、totalPrice列、totalPrice绑定属性等. 这些属性中的许多都有很有前途的名称(比如UpdateSourceTrigger,Bindmode=Twoway),但我try 了很多方法,似乎都不起作用. 我可能遗漏了一些东西,但平庸的文档和年轻的winui3并没有帮助, 我无法想象在微软的用户界面框架中不存在这个功能.

WPF开发人员使用属性已更改,我查找了具有该名称的内容,发现它是DatagridextColumn中的绑定属性或itemsource中的属性,但文档是这https://learn.microsoft.com/en-us/dotnet/api/communitytoolkit.winui.ui.controls.datagridboundcolumn.binding?view=win-comm-toolkit-dotnet-7.0#communitytoolkit-winui-ui-controls-datagridboundcolumn-binding

即使是一个临时的不优雅的修复也可以,比如重新加载数据网格,我只是需要一些东西.

希望能得到一些帮助.

推荐答案

我的第一个猜测是,您没有在您的属性上实现INotifyPropertyChange.

这是一个使用CommunityToolkit.Mvvm NuGet包的示例代码,它将为您生成实现INotifyPropertyChanged的代码.

Item.cs

public partial class Item : ObservableObject
{
    [ObservableProperty]
    private string name = string.Empty;

    [ObservableProperty]
    [NotifyPropertyChangedFor(nameof(Total))]
    private int price;

    [ObservableProperty]
    [NotifyPropertyChangedFor(nameof(Total))]
    private int quantity;

    public int Total => Price * Quantity;
}

MainPageViewModel.cs

public partial class MainPageViewModel : ObservableObject
{
    [ObservableProperty]
    private ObservableCollection<Item> items = new();

    public MainPageViewModel()
    {
        Items.Add(new Item { Name = "A", Price = 100, Quantity = 1 });
        Items.Add(new Item { Name = "B", Price = 200, Quantity = 2 });
        Items.Add(new Item { Name = "C", Price = 300, Quantity = 3 });
        Items.Add(new Item { Name = "D", Price = 400, Quantity = 4 });
        Items.Add(new Item { Name = "E", Price = 500, Quantity = 5 });
    }
}

MainPage.xaml

<Page
    x:Class="DataGridExample.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="using:DataGridExample"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    mc:Ignorable="d">
    <Page.DataContext>
        <local:MainPageViewModel x:Name="ViewModel" />
    </Page.DataContext>

    <Grid>
        <controls:DataGrid
            AutoGenerateColumns="False"
            ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}">
            <controls:DataGrid.Columns>
                <controls:DataGridTextColumn
                    Binding="{Binding Name}"
                    Header="Name"
                    IsReadOnly="True" />
                <controls:DataGridTextColumn
                    Binding="{Binding Price}"
                    Header="Price" />
                <controls:DataGridTextColumn
                    Binding="{Binding Quantity}"
                    Header="Quantity" />
                <controls:DataGridTextColumn
                    Binding="{Binding Total}"
                    Header="Total"
                    IsReadOnly="True" />
            </controls:DataGrid.Columns>
        </controls:DataGrid>
    </Grid>
</Page>

.net相关问答推荐

条带连接支付—引发异常

MSBuild:CopyToOutputDirectory不会将本机DLL复制到输出

如何在PowerShell中隐藏任务延迟输出?

如何按需计算一个值并将该值缓存在FP/F#中?

在本地运行 Azure 函数会在 .NET7 升级后出现无运行时错误

无法通过构建目标访问 dotnet 的环境变量

System.IO.Directory.Exists 在 LINQ 语句中失败,但在 foreach 循环中没有

为什么 GetShortestDayName 返回的名称比预期的短?

如何为多种文件类型设置 FileSystemWatcher 过滤器?

xunit Assert.ThrowsAsync() 不能正常工作?

Gacutil.exe 成功添加程序集,但在资源管理器中无法查看程序集.为什么?

File.ReadAllLines() 和 File.ReadAllText() 有什么区别?

如何以编程方式 Select ListView 中的项目?

如何根据新的安全策略在 .Net 中发送邮箱?

静态代码块

形成两个列表并集的最简单方法

C# List<> 按 x 然后 y 排序

在 IIS 中访问 .svc 文件时出现 HTTP 404

System.Array.CopyTo() 和 System.Array.Clone() 之间的区别

嵌套捕获组如何在正则表达式中编号?