C# Wpf 编辑 Datagrid 不会更新它的 itemsource

use*_*750 5 wpf datagrid propertychanged

我有一个像这样的 ObservableCollection,

ObservableCollection<Item> Found_Items = new ObservableCollection<Item>();

public struct Item
        {
            public bool Enabled { get; set; }
            public BitmapImage ItemIcon { get; set; }
            public string Path { get; set; }
            public string Size { get; set; }
        }
Run Code Online (Sandbox Code Playgroud)

我正在像这样设置 Datagrid 的 itemsource,

FoundItemsDatagrid.ItemsSource = Found_Items;
Run Code Online (Sandbox Code Playgroud)

我在 Datagrid 中有一个这样的复选框,

<DataGridTemplateColumn Header="Path" Width="*" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <DockPanel> 
                            <CheckBox IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>                         
                        </DockPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)

我想,每当我选中或取消选中 datagrid 上的复选框时,它都应该更新我的 ObservableCollection。

什么是最简单的方法来做到这一点?

谢谢..

Kel*_*lly 3

问题在于你如何绑定到你的集合。您正在显式设置 ItemsSource,因此 ObservableCollection 将不会按照您希望的方式工作。

而是像这样使用绑定:

<DataGridTemplateColumn Header="Path" Width="*" ItemsSource="{Binding Found_Items}" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <DockPanel> 
                            <CheckBox IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>                         
                        </DockPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)

然后确保您在后台执行此操作:

public ObservableCollection<Item> Found_Items {get; set;}
Run Code Online (Sandbox Code Playgroud)

为了反映每个项目的更改,您需要使用 INotifyPropertyChanged,如下所示:

public class Item : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private bool enabled;
        private BitmapImage itemIcon;
        private string path;
        private string size;


        public string Size
        {
            get { return size; }
            set
            {
                size = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Size"));
            }
        }


        public string Path
        {
            get { return path; }
            set
            {
                path = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Path"));
            }
        }


        public BitmapImage ItemIcon
        {
            get { return itemIcon; }
            set
            {
                itemIcon = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ItemIcon"));
            }
        }



        public bool Enabled
        {
            get { return enabled; }
            set
            {
                enabled = value;
                if(PropertyChanged!=null) PropertyChanged(this,new PropertyChangedEventArgs("Enabled"));
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

现在,当用户更改某个项目时,可以在 ObservableCollection 中看到更改。这要归功于 INotifyPropertyChanged。