【问题标题】:Using eventtrigger without clicking在不点击的情况下使用事件触发器
【发布时间】:2015-04-22 13:34:00
【问题描述】:

我有一个这样设置的 CheckBox:

    <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,反之亦然以响应用户输入。

问题是我需要 EventTrigger 在被 ViewModel 选中或取消选中时触发。

我尝试将“EventName”更改为“Checked”、“IsChecked”和“UnChecked”,但这似乎没有任何作用。

我需要实现任何其他代码吗?我该如何让它发挥作用?

【问题讨论】:

  • 如果虚拟机正在控制 ViewType,为什么不能只调用 Refresh() 本身?
  • 可以帮助Link
  • @GazTheDestroyer 好吧,你看到有问题的命令不存在于任何 VIewModel 中。它实际上位于程序集中。我只是认为如果我放 Refresh 会更容易解释,或者让人们了解总体思路。我真正需要执行的是命令; NavigationCommands.GoToPage

标签: wpf mvvm checkbox


【解决方案1】:

您不需要 Interaction.Triggers,

WPF 提供对commands 开箱即用的支持。

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

【讨论】:

    【解决方案2】:

    如果您需要在ViewTypeCheckbox.IsChecked 更改其值时调用某些代码,您可以简单地向视图模型的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");
           }
        }
      }
    }
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      您不需要触发器来执行您的操作。您可以在属性更改时在视图模型中执行此操作。

      public Boolean ViewType
      {
          get 
          { 
              return this.something; 
          }
      
          set 
          { 
              this.something = value;
              if (true == this.something)
              {
                  this.Refresh();
              }
          }
      }
      

      【讨论】:

      • 毫无疑问这会奏效。问题是,“刷新”只是出于解释性原因而放在那里。我希望执行的命令位于程序集库中。这就是让我感到棘手的原因。该命令实际上称为“NavigationCommands.GoToPage”。
      猜你喜欢
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多