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

时间:2014-08-01 13:32:03

标签: c# wpf xaml binding

我有一个绑定到我的VM上的字段的Label。 Label有两个控制模板,一个用于只读,另一个用于编辑模式。一切正常但我有一个问题。如果您将控件置于编辑模式并开始键入TextBox然后单击取消它不会将其还原为原始文本。如何强制它将文本重新绑定并恢复到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();

    } 

1 个答案:

答案 0 :(得分:0)

答案是正如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而创建的命令。