如何正确绑定数据网格和文本框,并仅在单击按钮后更新数据网格

本文关键字:网格 数据 数据网 单击 按钮 更新 绑定 何正确 文本 | 更新日期: 2023-09-27 17:53:21

我有WPF应用程序,绑定有问题。我的UI看起来像链接上的图像。(我很抱歉没有嵌入图像,因为我是一个新用户,需要获得积分才能发布图像)

https://i.stack.imgur.com/a1koN.jpg

基本上1产品可以有很多定价细节。该屏幕用于Edit模式,其中从数据库检索信息(为了这个示例,我只是硬编码了这些值)。在datagrid中选择一个项目将在其各自的文本框中加载信息。这是目前工作良好。我想修改的唯一一件事是改变文本框中的值时的行为,因为datagrid立即更新。一旦点击EDIT按钮,是否有可能只更新数据网格?注意,此时所做的任何更改都还没有持久化到数据库中,只有在单击UPDATE按钮(在顶部)时才会持久化。

下面是XAML文件的片段:

DataGrid

<DataGrid AutoGenerateColumns="False" AlternationCount="2" Height="100" ItemsSource="{Binding ProductPrices, Mode=TwoWay}" SelectedItem="{Binding ProductPrice}" IsReadOnly="True" SelectionMode="Single" GridLinesVisibility="Horizontal">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding UnitPrice, StringFormat='{0:N'}}" Header="Unit Price" Width="100" />
        <DataGridTextColumn Binding="{Binding LowestPrice, StringFormat='{0:N'}}" Header="Lowest Price" Width="100"/>
        <DataGridTextColumn Binding="{Binding EffectiveDate, StringFormat='{0:d'}}" Header="Effective Date" Width="150"/>
    </DataGrid.Columns>
</DataGrid>

文本框

<TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Path=ProductPrice.UnitPrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, StringFormat='{0:N'}}" Width="100" />
<TextBox Grid.Column="3" Grid.Row="0" Text="{Binding Path=ProductPrice.LowestPrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, StringFormat='{0:N'}}" Width="100" />
<DatePicker Grid.Column="1" Grid.Row="1" Text="{Binding Path=ProductPrice.EffectiveDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Width="100" />

ViewModel

    private Product _product;
    public Product Product
    {
        get { return _product; }
        set
        {
            _product = value;
            NotifyPropertyChanged(m => m.Product);
        }
    }
    private ProductPrice _productPrice;
    public ProductPrice ProductPrice
    {
        get { return _productPrice; }
        set
        {
            _productPrice = value;
            NotifyPropertyChanged(m => m.ProductPrice);
        }
    }
    private ObservableCollection<ProductPrice> _productPrices;
    public ObservableCollection<ProductPrice> ProductPrices
    {
        get { return _productPrices; }
        set
        {
            _productPrices = value;
            NotifyPropertyChanged(m => m.ProductPrices);
        }
    }

UpdateSourceTrigger=PropertyChanged一定是罪魁祸首。但我还是不知道该怎么破这个案子。使用MVVM方法是否可以实现?

我已经把源代码上传到SkyDrive

如何正确绑定数据网格和文本框,并仅在单击按钮后更新数据网格

您可以在绑定中使用显式UpdateSourceTrigger,然后在单击按钮时手动调用UpdateSource:

XAML绑定。UpdateSourceTrigger当一个按钮。点击被触发?

如果你想让这个过程更简单,为你所有的绑定定义一个BindingGroup,然后在你点击按钮的时候调用BindingGroup上的UpdateSources。您可以通过一个简单的行为或附加属性来实现对updatesource的调用。