所以我遇到了这个问题,希望你能帮忙解决。
我正在使用 MVVM Light 作为框架编写 WPF 应用程序。在这种情况下,我有一个项目列表,并且 SelectedItem 绑定到用户可以在其中编辑项目的详细信息视图。在本例中,有一个“保存”按钮用于显式保存数据。
我的问题是,当用户编辑数据时,更改会立即显示在列表中。如果用户取消,则会重置所选项目,但它仍然会发生变化。如何防止更改传播?
我尝试实现克隆实现,但一旦我这样做了,MVVM Light 的消息系统就会陷入循环,由于我不断克隆对象而导致 StackOverflowException。同样,克隆实现也很丑陋。
我知道如何正确地做到这一点吗?
EDIT:
列表视图的基本 XAML:
<DataGrid DataContext="{Binding SubJobTypes}"
ItemsSource="{Binding}"
SelectedItem="{Binding ElementName=Root, Path=DataContext.SelectedSubJobType, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
编辑视图的基本 XAML:
<StackPanel>
<StackPanel>
<StackPanel Orientation="Horizontal" DataContext="{Binding Path=CurrentSubJobType}">
<TextBlock Text="Name"/>
<TextBox Text="{Binding Path=Name, Mode=TwoWay}" Width="150"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="{Binding Path=SubmitCommandText, FallbackValue=Submit}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Path=SaveSubJobTypeCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Button Content="Cancel" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Path=CancelCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Button Content="Delete">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Path=DeleteCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</StackPanel>
</StackPanel>
</StackPanel>
ViewModels 是标准的,不会费心发布
您应该拥有两个视图模型,而不是禁用绑定机制,一个用于列表项,一个用于详细视图。一旦选择了某个项目,列表视图模型就会发送一条属性已更改的消息。然后,详细视图模型加载项目数据,或克隆模型并使用数据初始化自身。现在,详细视图模型可以更改其模型的本地实例。
完成后,数据将保存到数据库中,并且详细视图模型会发送一条消息,表明该项目已更改。列表视图模型现在接收消息并可以使用该模型更改其项目视图模型,或者您可以从数据库重新加载项目模型,然后更新项目视图模型。
这样,您就不必手动将值写入模型,并且如果您仅克隆模型,则不应遇到任何消息传递问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)