【问题标题】:Bind a static Method to a CheckBox and pass a parameter to it将静态方法绑定到 CheckBox 并将参数传递给它
【发布时间】:2016-08-11 09:32:39
【问题描述】:

我有一个复选框,如果复选框更改,我想运行我的方法OnCheckBoxChanged,现在我这样做:

<CheckBox x:Name="myCheckBox" 
          Content="Run my command"
          IsChecked="SetMyCheckBoxState" 
          Checked="OnCheckBoxChanged"
          Unchecked="OnCheckBoxChanged"/>

在后面的代码中:

private void SetMyCheckBoxState()
{
    return Helper.GetState();
}

private void OnCheckBoxChanged(object sender, RoutedEventArgs e)
{
   if (myCheckBox.IsChecked)
        //my logic 1 
   else
        //my logic 2
}

我想以 MVVM 风格做更多的事情,像这样:

   public static class Helper
   {
        public static bool GetState()
        {
            var state = //My logic;
            return state; 
        }

        public static void OnCheckBoxChanged(bool state)
        {
            if (state)
                 //my logic 1 
            else
                 //my logic 2
        }
   }

xaml 代码如下所示:

<CheckBox x:Name="myCheckBox" 
          Content="Run my command"
          IsChecked="{Binding Path=Helper.GetState(), Mode=TwoWay}" 
          Checked="{Binding Path=Helper.OnCheckBoxChanged(How to pass a state here ?)}"
          Unchecked="{Binding Path=Helper.OnCheckBoxChanged()}"/>

我的问题是如何将复选框状态传递给Checked="{Binding Path=Helper.OnCheckBoxChanged(How to pass a state here ?)}"

以及如何使它工作,我在这里缺少什么?

【问题讨论】:

  • 为什么不使用 bool 类型的属性?然后在 get 和 set 中执行你的逻辑,然后 value 总是会告诉你会发生什么(真或假)。

标签: .net wpf checkbox mvvm data-binding


【解决方案1】:

您可以使用布尔属性与复选框的 IsChecked 进行绑定

private bool _isSelected;
public bool IsSelected{
    get { return _isSelected; }
    set {
        if(_isSelected == value) return;

        _isSelected = value;
        NotifyPropertyChanged(()=> IsSelected);
    }
}

您可以将此属性绑定到 IsChecked,这将为您提供视图模型中复选框的状态

【讨论】:

    【解决方案2】:

    我假设您通常了解 MVVM 的工作原理。假设您的 CheckBox DataContext 是您的 ViewModel。那么:

    在 ViewModel 中:

    private bool state;
    public bool State
    {
      get
      {
        return state;   
      }
      set
      {
        state = value;
        OnCheckBoxChanged(value);
        OnPropertyChanged("State");
      }
    }
    

    在 XAML 中:

    <CheckBox x:Name="myCheckBox" 
          Content="Run my command"
          IsChecked="{Binding Path=State, Mode=TwoWay}" />
    

    【讨论】:

      【解决方案3】:

      如果您要使用 mvvm 样式,那么您真的不应该从您的视图中调用方法。相反,您应该绑定到属性。 所以对于你的复选框:

      <CheckBox Content="Run my command" IsChecked="{Binding Path=IsCheckBoxTicked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
      

      在你的视图模型中属性:

      public bool IsCheckBoxTicked
      { 
          get { return _isCheckBoxTicked;}
          set { _isCheckBoxTicked = value;
                 RaisePropertyChanged(IsCheckBoxTicked);
                //run any methods you want here.
              }
      

      想法是当你改变复选框值时,视图会通知视图模型并更新属性。

      注意:您需要查看如何将 INotifyPropertyChanged 实现到您的视图模型中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        • 2021-04-23
        相关资源
        最近更新 更多