0

我正在开发一个 wpf 应用程序,其中大多数屏幕由一个详细信息网格和一个显示所选网格项目的表单组成。

在此详细信息表单中,用户可以更新所选项目的各个属性。

这是一个 MVVM 应用程序,在我的视图模型中,我公开了两个属性,一个是模型的可观察集合,它充当网格的项目源。并且有一个选定项目模型绑定到网格的选定项目。

现在我的问题是当用户更改详细信息表单中选定项目的任何属性时,它会自动反映回网格,我尝试更改绑定模式但没有任何效果。

我只想确保所选项目发生更改,但除非用户保存这些更改,否则不应将其反映回网格。

4

2 回答 2

0

UpdateSourceTrigger=Explicit可能是你所追求的..

来自 MSDN:

当您将 UpdateSourceTrigger 值设置为 Explicit 时,源值仅在应用程序调用 UpdateSource 方法时更改

然后在你的保存方法中调用UpdateSource方法。这里的例子

从示例 MSDN:

如果您有一个对话框或用户可编辑的表单,并且您想推迟源更新,直到用户完成编辑字段并单击“确定”,您可以将绑定的 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>

然后在您的视图模型中:

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 回答