3

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にソース コードをアップロードしました

4

1 に答える 1

2

バインディングで明示的な UpdateSourceTrigger を使用し、ボタンがクリックされたときに UpdateSource を手動で呼び出すことができます。

Button.Clickが発生したときのXAML Binding.UpdateSourceTrigger?

プロセスを簡単にしたい場合は、すべてのバインディングに対して BindingGroup を定義し、ボタンをクリックしたときに BindingGroup で UpdateSources を呼び出すだけです。単純な動作または添付プロパティを介して UpdateSources への呼び出しを実装できます。

于 2013-01-14T05:38:50.200 に答える