我有一个绑定到我的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();
}
答案 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而创建的命令。