WPF CheckBox TwoWay绑定无法正常工作

时间:2013-04-18 23:18:03

标签: wpf xaml checkbox binding

我有

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

 public bool Foo{ get; set; }

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

2 个答案:

答案 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));
    }