WPF CheckBox TwoWay 绑定不起作用

Posted

技术标签:

【中文标题】WPF CheckBox TwoWay 绑定不起作用【英文标题】:WPF CheckBox TwoWay Binding not working 【发布时间】:2013-04-12 06:14:31 【问题描述】:

我有

 <DataGridCheckBoxColumn 
     Binding="Binding Path=Foo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged"
 />

 public bool Foo get; set; 

选中/取消选中设置Foo,但在代码中设置Foo 不会更改复选框状态。有什么建议吗?

【问题讨论】:

不知道为什么你被否决了。我有同样的问题,这解决了它。为你点赞。 【参考方案1】:

我花了几个小时寻找这个问题的完整答案。我猜有些人认为搜索这个问题的其他人知道基础知识——有时我们不知道。关于设置表单数据上下文的一个非常重要的部分通常会丢失:

    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));
    

【讨论】:

【参考方案2】:

当您在 DataContext 中设置 Foo 时,您需要引发 PropertyChanged 事件。通常,它看起来像:

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 事件并更新您的用户界面

【讨论】:

以上是关于WPF CheckBox TwoWay 绑定不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WPF TwoWay绑定在多个UserControl中

WPF DataGridCheckBoxColumn 绑定值后不能选中以及 能选中后,不能进行属性通知

wpf model 默认啥模式? twoWay?

twoWay 绑定在以 ObservableCollection 作为源的 ToggleButton 中不起作用

如何使用 TwoWay 模式将 Listview SelectedItem 绑定到文本框?

升级 .NET 版本后,TwoWay 或 OneWayToSource 绑定无法在只读属性上工作