0

ほとんどの画面が詳細グリッドと、グリッドの選択されたアイテムが表示されるフォームで構成されている wpf アプリケーションで作業しています。

この詳細フォームで、ユーザーは選択したアイテムの個々のプロパティを更新できます。

これは MVVM アプリケーションであり、ビュー モデルで 2 つのプロパティを公開しました。1 つは、グリッドの項目ソースとして機能するモデルの観察可能なコレクションです。グリッドの選択された項目にバインドする選択された項目モデルがあります。

今私の問題は、ユーザーが詳細フォームで選択したアイテムのプロパティを変更すると、自動的にグリッドに反映され、バインディングのモードを変更しようとしましたが、何も機能しません。

選択した項目が変更されていることを確認したいだけですが、ユーザーがこれらの変更を保存しない限り、グリッドに反映されるべきではありません。

4

2 に答える 2

0

UpdateSourceTrigger=Explicitあなたが求めているものかもしれません..

MSDN から:

UpdateSourceTrigger 値を Explicit に設定すると、アプリケーションが UpdateSource メソッドを呼び出したときにのみソース値が変更されます。

次に、保存メソッドでメソッドを呼び出すだけUpdateSourceです。例はこちら

MSDN の例から:

ダイアログまたはユーザーが編集可能なフォームがあり、ユーザーがフィールドの編集を終了して [OK] をクリックするまでソースの更新を延期したい場合は、バインディングの UpdateSourceTrigger 値を Explicit に設定できます。

于 2013-09-12T09:32:09.710 に答える
0

選択したアイテムのビュー モデルで指定されたプロパティを使用する代わりに、グリッドを表示する xaml で次のようなものを使用できます。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication3" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:ie="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="WpfApplication3.MainWindow" 
    x:Name="MyMainWindow">
<Grid>
    <DataGrid x:Name="myGrid" ItemsSource="{Binding myItems}">
        <ie:Interaction.Triggers>
            <ie:EventTrigger EventName="SelectionChanged">
                <ie:InvokeCommandAction Command="{Binding SelectedItemChangedCommand}"  CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}"/>
            </ie:EventTrigger>
        </ie:Interaction.Triggers>
    </DataGrid>
</Grid>

次に、View Model で:

public class MainWindowViewModel
{
    public MainWindowViewModel()
    {
        myItems = new ObservableCollection<Person>
        {
            new Person("John", 23),
            new Person("Kobi", 25),
            new Person("Lizard", 43)
        };

        SelectedItemChangedCommand = new DelegateCommand<object>((selectedItem) => 
            {
                var selected = selectedItem as Person;

                // Do whatever you want to display the properties of your selected item
                // and let you user change them
            });
    }

    public ObservableCollection<Person> myItems { get; set; }

    public DelegateCommand<object> SelectedItemChangedCommand { get; set; }
}

public class Person
{
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public string Name { get; set; }

    public int Age { get; set; }
}
于 2013-09-12T06:32:42.887 に答える