复选框取消选中事件触发选中和未选中事件

时间:2018-07-31 16:14:01

标签: c# wpf xaml

你好,我遇到问题了,我不知道是什么原因造成的,

<ListView.View>
  <GridView>
    <GridViewColumn.CellTemplate>
      <DataTemplate><CheckBox IsChecked="{Binding IsAssignedToThis,IsAsync=True}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
      </DataTemplate>
    </GridViewColumn.CellTemplate>
  </GridViewColumn>
 </GridView>
</ListView.View>

CheckedUnchecked事件

private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Checked");
    //some code
}

 private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
 {
     MessageBox.Show("unChecked");
     //some code
  }

IsChecked中,值是bool类型,它们工作正常,因为它标记了CheckBoxes,但是当我尝试取消选中它时,会同时触发已选中和未选中的事件。我想念什么?

2 个答案:

答案 0 :(得分:1)

是的,我转载了您的问题。一些测试显示了异步绑定中的问题。

我认为这是一个有趣的情况。

让我们开始解释。 应用程序启动,未选中该复选框。用户检查我们的元素。活动分步进行。

  • 初始设置值-调用属性设置器。
  • 最终设置值-属性设置器的最终工作。设置了一个值。
  • 已检查-引发已检查事件。

很酷。用户未选中的复选框。

  • 开始设置值-属性设置器已启动。
  • 未选中-引发未选中事件。
  • 已检查-设置器属性仍处于繁忙状态。复选框“ IsChecked”属性不变,不会引发选中事件。
  • 最终设置值-设置员已完成工作。在绑定属性中设置的值。
  • 未选中-由于绑定属性更改为false,引发未选中事件。

我的测试代码。 ViewModel和后面的代码

    public class TestView
    {
        private bool _test;
        public bool TestProp
        {
            get => _test;
            set
            {
                Console.WriteLine("Start set value");
                Thread.Sleep(5000);
                _test = value;
                Console.WriteLine("End set value");
            }
        }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new TestView();
        }

        private void ToggleButton_OnChecked(object sender, RoutedEventArgs e)
        {
            Console.WriteLine("Checked");
        }

        private void ToggleButton_OnUnchecked(object sender, RoutedEventArgs e)
        {
            Console.WriteLine("Unchecked");
        }
    }

Xaml部分

<Grid>
    <CheckBox Checked="ToggleButton_OnChecked" IsChecked="{Binding TestProp, IsAsync=True}" Unchecked="ToggleButton_OnUnchecked"></CheckBox>
</Grid>

您可以使用“单击”事件(但是如果用户将使用键盘来更改复选框值,则单击事件不会引发)或在属性设置器中调用事件逻辑。它将更适用于MVVM。

答案 1 :(得分:0)

为了避免这种情况的发生,每次建议弹出两个事件,我建议使用一个更改信号为两个事件设置相同的处理程序,如下所示:

<CheckBox Checked="CheckBoxChanged" Unchecked="CheckBoxChanged"/>

private void CheckBoxChanged(object sender, RoutedEventArgs e)
{
  MessageBox.Show("State has been changed.");
}
相关问题