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

时间:2013-01-14 04:59:29

标签: c# wpf xaml mvvm

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

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

基本上1个产品可以有很多定价细节。屏幕用于编辑模式,从数据库中检索信息(为了这个示例,我只是对值进行了硬编码)。选择datagrid中的项目将加载有关其各自文本框的信息。这目前工作正常。我想要修改的唯一内容是更改文本框中的值时的行为,因为datagrid会立即更新。单击EDIT按钮后,是否可以仅更新数据网格?请注意,此时所做的任何更改尚未保留在数据库中,只有在单击UPDATE按钮(位于顶部)时才会保留。

以下是XAML文件的片段:

数据网格

<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" />

视图模型

    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

上传了源代码

1 个答案:

答案 0 :(得分:2)

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

XAML Binding.UpdateSourceTrigger when a Button.Click is fired?

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