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