复选框双向绑定不起作用

本文关键字:不起作用 绑定 复选框 | 更新日期: 2023-09-27 18:18:54

我想为ListView中的复选框做双向绑定。这是我的Product类:

public class Product
{
    public bool IsSelected { get; set; }
    public string Name { get; set; }
}

在ViewModel类中,我有产品的可观察集合:

    private ObservableCollection<Product> _productList;
    public ObservableCollection<Product> ProductList
    {
        get
        {
            return _productList;
        }
        set
        {
            _productList = value;
        }
    }
    public MainViewModel()
    {
        ProductList = new ObservableCollection<Product>
                          {
                              new Product {IsSelected = false, Name = "Not selected"},
                              new Product {IsSelected = true, Name = "Selected"},
                              new Product {IsSelected = true, Name = "Selected"}
                          };
    }
}

最后是Grid with ListView它绑定了ProductList

<Grid>
    <ListView Height="120" HorizontalAlignment="Left" 
                  VerticalAlignment="Top"
                  SelectionMode="Multiple" 
                  ItemsSource="{Binding ProductList}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Width="40">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Width="120" Header="Product Name" DisplayMemberBinding="{Binding Path=Name}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

当我调试这个应用程序时,当我选中/取消选中复选框时,它永远不会到达setter的行。你知道这段代码有什么问题吗?提前感谢!

复选框双向绑定不起作用

对于双向绑定的工作,你应该首先在你的视图模型和产品类中实现INotifyPropertyChanged事件,以确保当属性视图中的一些变化被立即通知

还要确保正确设置DataContext

view.DataContext = yourViewModel;

就像Fischermaen提到的你不能调试这种属性如果你想调试

你应该做这样的事情
 public class Product
    {
        private bool isSelected;
        public bool IsSelected
        {
            get { return isSelected; }
            set { isSelected = value; }
        }
    }

您将CheckBox绑定到IsSelected属性。此属性实现为自动实现属性。在调试器中,你永远不会在setter或getter处中断。我看不出你的代码有什么问题,它应该像你写过的那样工作。

您应该实现一个绑定类型的INotifyPropertyChanged接口,并且当IsSelected属性设置时必须通知。

msdn:

文档和示例http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx