【发布时间】:2014-08-06 22:22:26
【问题描述】:
我有一个绑定到我的 VM 上的字段的标签。标签有两个控制模板,一个用于只读模式,一个用于编辑模式。一切正常,但我有一个问题。如果您将控件置于编辑模式并开始在 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();
}
【问题讨论】:
-
你需要在你的
VM中实现IEditableObject接口并调用CancelEdit