我有
<DataGridCheckBoxColumn
Binding="{Binding Path=Foo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>
和
public bool Foo{ get; set; }
选中/取消选中设置Foo
,但在代码中设置Foo
不会更改复选框状态。有什么建议吗?
答案 0 :(得分:18)
当您在PropertyChanged
中设置Foo时,需要引发DataContext
事件。通常,它看起来像:
public class ViewModel : INotifyPropertyChanged
{
private bool _foo;
public bool Foo
{
get { return _foo; }
set
{
_foo = value;
OnPropertyChanged("Foo");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
var propertyChanged = PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
如果您致电Foo = someNewvalue
,则会引发PropertyChanged
事件并更新您的用户界面
答案 1 :(得分:0)
我花了几个小时寻找有关此问题的完整答案。我猜有些人以为其他搜索此问题的人了解基本知识-有时我们却不知道。通常缺少有关设置表单数据上下文的非常重要的部分:
public YourFormConstructor()
{
InitializeComponent();
DataContext = this; // <-- critical!!
}
我的复选框控件是在xaml文件中设置的,如下所示:
<CheckBox x:Name="chkSelectAll" IsChecked="{Binding chkSelectAllProp, Mode=TwoWay}" HorizontalAlignment="Left"/>
“ Path =“和” UpdateSourceTrigger = ...“部分似乎是可选的,因此我将其省略。
我在ListView标头列中使用此复选框。当有人选中或取消选中该复选框时,我希望ListView中的所有项目也都处于选中或取消选中状态(选择/取消选择所有功能)。我在示例中保留了该代码(作为“可选逻辑”),但是您的复选框值逻辑(如果有的话)将替换它。
通过浏览文件来设置ListView的内容,并选择一个新文件时,代码设置ListView ItemsSource并选中CheckBox(选择所有新的ListView项),这就是这种双向操作的原因需要。该示例中不存在该部分代码。
xaml.cs文件中用于处理CheckBox的代码如下:
// backing value
private bool chkSelectAllVal;
// property interchange
public bool chkSelectAllProp
{
get { return chkSelectAllVal; }
set
{
// if not changed, return
if (value == chkSelectAllVal)
{
return;
}
// optional logic
if (value)
{
listViewLocations.SelectAll();
}
else
{
listViewLocations.UnselectAll();
}
// end optional logic
// set backing value
chkSelectAllVal = value;
// notify control of change
OnPropertyChanged("chkSelectAllProp");
}
}
// object to handle raising event
public event PropertyChangedEventHandler PropertyChanged;
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}