将静态方法绑定到CheckBox并向其传递参数



我有一个复选框,如果复选框改变了,我想运行我的方法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 ?)}"

如何让它工作,我在这里错过了什么?

可以使用布尔属性绑定复选框的IsChecked

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

你可以将这个属性绑定到IsChecked它会给你视图模型中的复选框状态

我假设你知道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}" />

如果你要使用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到你的视图模型

最新更新