C# 在WPF MVVM on按钮中,单击如何让我的视图在对视图模型的命令引用之前或之后执行某些操作?

C# 在WPF MVVM on按钮中,单击如何让我的视图在对视图模型的命令引用之前或之后执行某些操作?,c#,wpf,mvvm,binding,C#,Wpf,Mvvm,Binding,在一个表单上,我有一个标签和一个编辑按钮。单击“编辑”按钮时,标签的控制模板将更改为显示文本框和保存按钮。该保存按钮绑定到视图模型上的保存命令 我的问题是,单击“保存”按钮时,我希望它在视图模型上执行命令之前或之后将控件模板更改回标签。在我的特殊情况下,除了正在执行的命令外,只要单击“保存”按钮,它所需要做的就是将标签上的属性设置为True conv:ReadOnlyControlTemplate.DoLock="True" 更新 多亏了下面答案中的一些反馈,我现在更接近了。我将以下内容用于“

在一个表单上,我有一个标签和一个编辑按钮。单击“编辑”按钮时,标签的控制模板将更改为显示文本框和保存按钮。该保存按钮绑定到视图模型上的保存命令

我的问题是,单击“保存”按钮时,我希望它在视图模型上执行命令之前或之后将控件模板更改回标签。在我的特殊情况下,除了正在执行的命令外,只要单击“保存”按钮,它所需要做的就是将标签上的属性设置为True

conv:ReadOnlyControlTemplate.DoLock="True"
更新 多亏了下面答案中的一些反馈,我现在更接近了。我将以下内容用于“保存”按钮:

<i:Interaction.Triggers>
                                        <ei:DataTrigger Comparison="Equal" Binding="{Binding Test, Converter={StaticResource TestConverter}, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" Value="CommandUpdated"  >
                                            <ei:ChangePropertyAction  PropertyName="conv:ReadOnlyControlTemplate.DoLock" Value="True" TargetObject="{Binding ElementName=ShiftManagerMessages}" /> 
                                        </ei:DataTrigger>
                                    </i:Interaction.Triggers>

从ei:ChangePropertyAction的TargetName更改为TargetObject使其正确查看标签。但是现在我得到了以下错误:

{“在类型\“Label\”上找不到名为\“conv:ReadOnlyControlTemplate.DoLock\”的属性}


我可以将它指向其他属性,但不是这个属性,我不明白为什么?

不确定我是否正确地解决了问题,但您可以通过订阅按钮的各种(预览)鼠标下移事件在视图中运行一些代码,并在那里更改布局。也就是说,如果您反对在MVVM项目中使用代码隐藏。您的按钮将触发VM中的命令处理程序和视图中的事件处理程序

<Button MouseDown="Button_MouseDown" Command="{Binding SaveCommand}" />

 private void Button_MouseDown(object sender, System.Windows.RoutedEventArgs e)
 {
    // Set your property
 }

私有无效按钮\u鼠标向下(对象发送器,System.Windows.RoutedEventArgs e)
{
//设置您的属性
}

<代码>后面的代码是一个选项,但是考虑如果命令失败,该怎么做。如果有ViewModel,可以使用绑定到属性的数据触发器或模板选择器

上周我发布了一个关于如何编写数据模板选择器并将控件绑定到它的答案

使用DataTrigger执行此操作-添加对Microsoft.Expressions.Interactions的引用,然后添加XAML

xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
在您的命名空间中,然后

<i:Interaction.Triggers>
    <ei:DataTrigger Binding="{Binding ViewModel.State}" Value="CommandUpdated">
         <Setter Property="Foreground" Value="Red" />
    </ei:DataTrigger>
</i:Interaction.Triggers>


这通过基于viewmodel中的属性“状态”触发来实现。在这种情况下,state是一个枚举,其中CommandUpdated是该枚举的一个值-它可以很容易地是bool或int。

使用DataTrigger控制模板的示例:

<UserControl x:Class="NextPlc.Instore.Epos.Till.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
            xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
    <ControlTemplate TargetType="Label" x:Key="ReadOnlyTemplate"></ControlTemplate>
    <ControlTemplate TargetType="Label" x:Key="EditTemplate"></ControlTemplate>
</UserControl.Resources>
<i:Interaction.Triggers>
    <ei:DataTrigger Binding="{Binding IsReadOnly}" Value="True">
        <ei:DataTrigger.Actions>
            <ei:ChangePropertyAction TargetName="label" PropertyName="Template" Value="{StaticResource ReadOnlyTemplate}"/>
        </ei:DataTrigger.Actions>
    </ei:DataTrigger>
    <ei:DataTrigger Binding="{Binding IsReadOnly}" Value="False">
        <ei:DataTrigger.Actions>
            <ei:ChangePropertyAction TargetName="label" PropertyName="Template" Value="{StaticResource EditTemplate}"/>
        </ei:DataTrigger.Actions>
    </ei:DataTrigger>
</i:Interaction.Triggers>
<Grid>
    <Label x:Name="label">
    </Label>
</Grid>


我根本没有发现这种情况。在按钮上定义单击实际上取代了根本没有运行的命令。删除Click属性导致命令正常运行。您可以选择从Click事件执行命令:var btn=sender as Button;btn.Command.Execute(btn.CommandParameter);唯一的问题是btn.命令将为空。无论出于何种原因,您都无法看到在XAML中设置的命令。i:Interaction.Triggers来自哪个命名空间?我尝试添加:xmlns:I=“”,但它不喜欢。xmlns:I=“”xmlns:ei=“”您是否已将引用添加到您的项目中?很抱歉,它混淆了,并向我抛出了错误的错误,在清理后修复。它实际上抱怨的是Setter标记,它说它需要一个TriggerAction,它看起来像是在Setter标记所在的地方需要一个TriggerAction。我可以用在它的地方,这将建立。然而,它在运行时似乎没有做任何事情。我还在ei:DataTrigger绑定中添加了一个TestConverter,以确保正确地设置和提取了值,事实就是这样。只是ei:ChangePropertyAction没有做任何事情。你知道为什么吗?我不能指出那处房产,因为它是附属房产。