如何在取消更改后恢复文本

本文关键字:恢复 文本 取消 | 更新日期: 2023-09-27 18:16:02

我有一个标签,绑定到我的VM上的一个字段。Label有两个控件模板,一个用于只读,另一个用于编辑模式。一切正常,但我有一个问题。如果您将控件置于编辑模式并开始在文本框中键入,然后点击取消,则不会将其恢复为原始文本。如何强制它重新绑定并将文本恢复到VM上的文本?

<Label Grid.Column="0" Grid.Row="0" Name="ShiftManagerMessages" Content="{Binding Path=Messages, IsAsync=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" Foreground="White" FontSize="18px" Margin="5,5,5,5" 
                                   conv:ReadOnlyControlTemplate.Enabled="False" conv:ReadOnlyControlTemplate.DoLock="{Binding Path=MessageUpdateSuccessful, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" HorizontalAlignment="Left" HorizontalContentAlignment="Left" VerticalAlignment="Top" Height="54" Width="1150">
                                <Control.Template>
                                    <ControlTemplate TargetType="{x:Type Label}">
                                        <WrapPanel>
                                            <TextBox Width="1000" HorizontalAlignment="{TemplateBinding Property=HorizontalAlignment}" VerticalAlignment="Top" Height="150" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, Mode=TwoWay}" TextWrapping="Wrap" AllowDrop="True" />
                                    <Button Content="Cancel" Width="65"  Height="30" HorizontalAlignment="Right" Cursor="Hand" Margin="5,0,5,0" Click="CancelShiftMessage_Click"  />
                                    <Button Content="Save" Width="50"  Height="30" HorizontalAlignment="Right" Cursor="Hand" Margin="0,0,0,0"  Command="{Binding SaveMessagesCommand}" />
                                        </WrapPanel>
                                    </ControlTemplate>
                                </Control.Template>
                                <conv:ReadOnlyControlTemplate.LockTemplate>
                                    <ControlTemplate TargetType="{x:Type Label}">
                                        <TextBlock Width="{TemplateBinding Property=Width}" Height="{TemplateBinding Property=Height}" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, Mode=TwoWay }" Margin="0,0,0,0" Padding="0,0,0,0"
                                                   Foreground="{TemplateBinding Property=Foreground}" FontSize="{TemplateBinding Property=FontSize}" TextWrapping="Wrap"  HorizontalAlignment="{TemplateBinding Property=HorizontalAlignment}" VerticalAlignment="{TemplateBinding Property=VerticalAlignment}" /> 
                                    </ControlTemplate>
                                </conv:ReadOnlyControlTemplate.LockTemplate>
                            </Label>

我已经尝试了我所知道的唯一绑定更新的几个变体,但它们都不成功。

private void CancelShiftMessage_Click(object sender, RoutedEventArgs e)
    {
        ReadOnlyControlTemplate.SetDoLock(ShiftManagerMessages, true);
        BindingOperations.GetBindingExpressionBase(ShiftManagerMessages, Label.ContentProperty).UpdateTarget();
        BindingOperations.GetBindingExpression(ShiftManagerMessages, Label.ContentProperty).UpdateTarget();
    } 

如何在取消更改后恢复文本

答案是Sriram Sakthivel的评论建议,在我的ViewModel上实现IEditableObject接口。接口公开了3个方法:BeginEdit(), CancelEdit()和EndEdit()。我添加了3个命令来配合这些方法,并添加了一个比特来指示模式是否为只读。

在BeginEdit()中,我将编辑模式设置为true并复制原始消息。但是,如果我处理多个字段,我建议使用MemberwiseClone获得对象的副本。但是,如果您的编辑包含任何引用类型,则需要进行深度复制。

public void BeginEdit()
    {
        IsEditing = true;
        originalmessage = this.Messages;
    }

在CancelEdit()中,我将消息设置回原始状态并更改编辑模式。

public void CancelEdit()
    {
        this.Messages = originalmessage;
        IsEditing = false;
    }

在EndEdit()中保存实际更改并重置编辑模式。

public void EndEdit()
    {
        IsEditing = false;
        repository.SaveMessages(this.Messages); 
    }

在Xaml中,显示的控件模板绑定到IsEditing属性,编辑,取消和保存命令绑定到那些创建支持IEditableObject的命令。