MVVM 实现的问题:对所选项目的更改传播到列表,不希望这样

2024-03-13

所以我遇到了这个问题,希望你能帮忙解决。

我正在使用 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(使用前将#替换为@)

MVVM 实现的问题:对所选项目的更改传播到列表,不希望这样 的相关文章

随机推荐