首页 > 解决方案 > 绑定到模型属性的 DataGridComboBoxColumn 不更新

问题描述

我想将 a 绑定DataGridComboBoxColumn到模型中的一个属性,这是另一个我面临以下两个问题之一的模型:

应用启动后的表单(这是一个演示问题的示例应用,真实应用只有一个Vat-Column)

在此处输入图像描述

VatCombo1 不显示增值税属性的值

VatCombo2 不显示增值税属性的值

VatCombo3 正确显示了 Vat 属性的值

VatCombo1 的值更改为 19 后的表格 --> VatId 和 VatRate 正确显示

在此处输入图像描述

将值 VatCombo3 更改为 19 后的表单 --> 未更新增值税率

在此处输入图像描述

我怎样才能到“DataGridComboBoxColumn”工作?即显示存储在模型属性中的初始值,并在从Combobox右侧选择另一个项目时更改值 Id AND Rate?

Idealley VatCombo1 显示初始负载值的方法?

模型中的属性

    private VatModel vat;

    public VatModel Vat
    {
        get { return vat; }
        set
        {
            vat = value;
            OnPropertyChanged(new PropertyChangedEventArgs(nameof(Vat)));
        }
    }

视图模型

    public ViewModel()
    {
        VatList.Add(new VatModel(1, 0.00));
        VatList.Add(new VatModel(2, 7.00));
        VatList.Add(new VatModel(3, 19.00));

        VatModel receiptItemVat = new VatModel(2, 7.00);
        ReceiptItemModel receiptItem = new ReceiptItemModel(1, receiptItemVat);

        ReceiptModel receipt = new ReceiptModel();
        receipt.Id = 10;
        receipt.Items.Add(receiptItem);

        Receipt = receipt;      
    }

夏尔姆

<Window x:Class="datagridcombo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:datagridcombo"
        mc:Ignorable="d"        
        Title="MainWindow" Height="450" Width="800">

    <Window.DataContext>
        <local:ViewModel/>
    </Window.DataContext>

    <Window.Resources>
        <CollectionViewSource Source="{Binding  VatList}" x:Key="VatListRes"/>
    </Window.Resources>



    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <Label Content="{Binding Receipt.Id}"/>

        <DataGrid ItemsSource="{Binding Receipt.Items}" Grid.Row="1" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="ReceiptItemId" Binding="{Binding Id}" Width="80"/>
                <DataGridTextColumn Header="VatId" Binding="{Binding Vat.Id}" Width="80"/>
                <DataGridTextColumn Header="VatRate" Binding="{Binding Vat.Rate}" Width="80"/>

                <!-- Initial value not shown, Property update works -->
                <DataGridComboBoxColumn Header="VatCombo1"
                                        ItemsSource="{Binding Source={StaticResource VatListRes}}"
                                        SelectedItemBinding="{Binding Vat, UpdateSourceTrigger=PropertyChanged}"}"
                                        DisplayMemberPath="Rate"
                                        />

                <!-- Initial value not shown, Property update when Enter is hit -->
                <DataGridComboBoxColumn Header="VatCombo2"
                                        ItemsSource="{Binding Source={StaticResource VatListRes}}"
                                        SelectedValuePath="Id"
                                        DisplayMemberPath="Rate"
                                        />

                <!-- Initial value not shown, Property not updated -->
                <DataGridComboBoxColumn Header="VatCombo3"
                                        ItemsSource="{Binding Source={StaticResource VatListRes}}"
                                        SelectedValueBinding="{Binding Vat.Id, UpdateSourceTrigger=PropertyChanged}"
                                        SelectedValuePath="Id"
                                        DisplayMemberPath="Rate"
                                        />


            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

标签: c#wpfdata-binding

解决方案


链接对象时,请始终确保使用相同的引用。在您的情况下,您将所选项目链接到 的项目源ComboBox,但初始值的实例不是ComboBox.ItemsSource. 所以ComboBox不会选择任何东西。ComboBox或者ItemsControl通常也检查引用相等性,以便知道在SelectedItem设置时选择哪个项目。

要解决此问题,请使用以下实例初始化所选值ItemsSource

public ViewModel()
{
  VatList.Add(new VatModel(1, 0.00));

  var initialSelectedItem = new VatModel(2, 7.00);
  VatList.Add(initialSelectedItem);

  VatList.Add(new VatModel(3, 19.00));

  VatModel receiptItemVat = initialSelectedItem;
  ReceiptItemModel receiptItem = new ReceiptItemModel(1, receiptItemVat);

  ReceiptModel receipt = new ReceiptModel();
  receipt.Id = 10;
  receipt.Items.Add(receiptItem);

  Receipt = receipt;      
}

推荐阅读