Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 识别何时因绑定原因触发复选框\u Checked事件_C#_Wpf_Checkbox - Fatal编程技术网

C# 识别何时因绑定原因触发复选框\u Checked事件

C# 识别何时因绑定原因触发复选框\u Checked事件,c#,wpf,checkbox,C#,Wpf,Checkbox,如果以前有人问过这个问题,我很抱歉,但是我找不到任何有用的东西 我有以下课程 public class NumberOfInterest { public bool HasChanged { get; set; } = false; public bool Prop1 { get; set; } public bool Prop2 { get; set; } --- } 在我的用户控件中,我有一个数据网格,它将可观测集合用作项目源。在这个网格中,我有两个分别绑定

如果以前有人问过这个问题,我很抱歉,但是我找不到任何有用的东西

我有以下课程

public class NumberOfInterest
{
    public bool HasChanged { get; set; } = false;
    public bool Prop1 { get; set; }
    public bool Prop2 { get; set; }
    ---
}
在我的用户控件中,我有一个
数据网格
,它将
可观测集合
用作项目源。在这个网格中,我有两个分别绑定到Prop1和Prop2的
复选框

最后,当从初始状态发生更改(即Prop1或Prop2更改)时,每个
NumberOfInterest
的属性
HasChanged
应设置为true

属性HasChanged在CanExecute事件中的命令中按以下方式使用

    public ICommand Save
    {
        get
        {
            save = new RelayCommand(() => SaveChanges(), () => NumbSource.Any(x => x.HasChanged));
            return save;
        }
    }
    private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        CheckBox c = sender as CheckBox;
        if (!(c.DataContext is NumberOfInterest n))
            return;
        n.HasChanged = true;
        n.Prop1 = c.IsChecked.Value;
    }
复选框使用以下方式选中的事件复选框

    public ICommand Save
    {
        get
        {
            save = new RelayCommand(() => SaveChanges(), () => NumbSource.Any(x => x.HasChanged));
            return save;
        }
    }
    private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        CheckBox c = sender as CheckBox;
        if (!(c.DataContext is NumberOfInterest n))
            return;
        n.HasChanged = true;
        n.Prop1 = c.IsChecked.Value;
    }
Prop2也有类似的例子

问题是,如果my item source中的元素在默认情况下将2 Prop1或Prop2中的任何一个设置为true,则HasChanged会自动设置为true

我想找到一种方法,仅在用户控件处于用户处置状态(即用户可以使用它进行提取并加载所有内容)后,才触发
CheckBox\u Checked
事件

我试图设置
加载的
初始化的
来设置本地布尔值,但这些事件在实际设置项目源之前触发

我还尝试了复选框绑定中的Mode=“OneWayToSource”,但这首先会阻止复选框设置为正确的状态

这应该可以:

n.HasChanged = n.Prop1 != c.IsChecked.Value;
n.Prop1 = c.IsChecked.Value;
或:


为什么不在
NumberOfInterest
类中处理此问题,而不是在视图中处理
Checked
事件

public class NumberOfInterest
{
    public bool HasChanged { get; set; } = false;

    private bool _prop1;
    public bool Prop1
    {
        get { return _prop1; }
        set
        {
            if (value != _prop1)
            {
                _prop1 = value;
                HasChanged = true;
            }
        }
    }

    private bool _prop2;
    public bool Prop2
    {
        get { return _prop2; }
        set
        { 
            if(value != _prop2)
            {
                _prop2 = value;
                HasChanged = true;
            }
        }
    }
}
如果您最初设置了
Prop1
Prop2
属性(而不是设置支持字段),则在执行此操作后,还应将
HasChanged
设置为
false

更好的方法是定义执行初始化的自定义构造函数:

public class NumberOfInterest
{
    public bool HasChanged { get; private set; } = false;

    public NumberOfInterest(bool prop1, bool prop2)
    {
        _prop1 = prop1;
        _prop2 = prop2;
    }

    private bool _prop1;
    public bool Prop1
    {
        get { return _prop1; }
        set
        {
            if (value != _prop1)
            {
                _prop1 = value;
                HasChanged = true;
            }
        }
    }

    private bool _prop2;
    public bool Prop2
    {
        get { return _prop2; }
        set
        { 
            if(value != _prop2)
            {
                _prop2 = value;
                HasChanged = true;
            }
        }
    }
}

然后,您还可以将
属性的设置器设置为私有。

我自己更正。起初我觉得它很管用,但后来我意识到它实际上并不管用。绑定n.Prop1的原因不能与c.IsChecked.Value不同,因为复选框已将IsCheckedproperty绑定到Prop1