Wpf 使用eventtrigger而不单击

Wpf 使用eventtrigger而不单击,wpf,mvvm,checkbox,Wpf,Mvvm,Checkbox,我有一个复选框,设置如下: <CheckBox x:Name="ViewTypeCheckbox" IsChecked="{Binding ViewType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click">

我有一个复选框,设置如下:

    <CheckBox x:Name="ViewTypeCheckbox" IsChecked="{Binding ViewType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <i:InvokeCommandAction Command="{Binding Refresh}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </CheckBox>

这就是它的功能。通过鼠标单击选中或取消选中时,将在ViewModel中激发该命令

您可以看到,复选框被数据绑定到bool属性(“ViewType”),该属性根据用户输入定期从true变为false,反之亦然

问题是当ViewModel选中或取消选中时,我需要触发EventTrigger

我尝试过将“EventName”改为“Checked”、“IsChecked”和“UnChecked”,但似乎没有任何效果


我是否需要实现其他代码?我怎样才能让它工作呢?

您不需要交互。触发器,

WPF提供了对开箱即用的支持


尝试使用命令属性来简化XAML。它应该可以解决您的问题。

如果在选中查看类型复选框时需要调用一些代码,则只需将事件处理程序注册到视图模型的PropertyChanged事件(假设它实现了INotifyPropertyChanged),然后在属性ViewType更改时调用代码:

myViewModel.PropertyChanged += new PropertyChangedEventHandler(onPropertyChanged);
...
private void onPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName=="ViewType")
    {
      // Do your stuff here
      // Ex. fire the Refresh Command
    }
}
这可以在ViewModel类本身中完成,也可以根据需要执行。 为了完成该示例,我在viewmodel类中添加了
INotifyPropertyChanged
的一个简短实现:

public class MyViewModel : INotifyPropertyChanged
{
    ...
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void RaisePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler!=null)
        {
           handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

  ...

  // property definition to bind to ViewTypeCheckbox.IsChecked
  private bool _viewType;
  public bool ViewType
  {
    get { return _viewType; }
    set
    {
       if (value != _viewType)
       {
         _viewType = value;
         RaisePropertyChanged("ViewType");
       }
    }
  }
}

希望它能帮助你,你不需要触发器来执行你的动作。属性更改时,可以在viewmodel中执行此操作

public Boolean ViewType
{
    get 
    { 
        return this.something; 
    }

    set 
    { 
        this.something = value;
        if (true == this.something)
        {
            this.Refresh();
        }
    }
}

如果VM正在控制ViewType,为什么不能直接调用Refresh()本身呢?这可能有助于@GazTheDestroyer。您可以看到,有问题的命令不存在于任何VIewModel中。它实际上位于一个组件中。我只是想,如果我把“刷新”放进去,解释起来会更容易,或者让人们更容易理解。我真正需要执行的是命令;NavigationCommands.GoToPageNo对此表示怀疑。问题是,“刷新”只是出于解释性的原因放在那里。我希望执行的命令驻留在程序集库中。这正是让我感到棘手的原因。该命令实际上称为“NavigationCommands.GoToPage”。