XAML 为什么DataGrid项为空,即使它绑定到在WPF中具有行的ObservableCollection?

8qgya5xd  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(306)

我使用的是C# WPF
我有一个Datagrid,其中填充了一个可观察的集合,该集合名为:“ALLTASKLIST”填充从数据库中选择数据
我使用DataBinding在DataGrid中显示“ALLTASKLIST”中的数据
但它是空的!
XAML文件:<DataGrid.Columns>

<DataGridComboBoxColumn Header="CMB">
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=ALLTASKLIST}" />
                        <Setter Property="DisplayMemberPath" Value="NAMES" />
                        <Setter Property="SelectedValuePath" Value="CODE" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
        </DataGrid.Columns>

       
    </DataGrid>

后面的代码:

public partial class MainWindow : Window
    {
        NEGIN1401Entities dbms = null;
        public class ThePart1 : INotifyPropertyChanged
        {
            private int? _CODE;
            private string _NAMES;
            private int? _KIND;
            private int? _idd;
            public int? CODE
            {
                get { return _CODE; }
                set
                {
                    _CODE = value;
                    OnPropertyChanged("CODE");
                }
            }
            public string NAMES
            {
                get { return _NAMES; }
                set
                {
                    _NAMES = value;
                    OnPropertyChanged("NAMES");
                }
            }
            public int? KIND
            {
                get { return _KIND; }
                set
                {
                    _KIND = value;
                    OnPropertyChanged("KIND");
                }
            }
            public int? idd
            {
                get { return _idd; }
                set
                {
                    _idd = value;
                    OnPropertyChanged("idd");
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
            public void OnPropertyChanged(string strCaller = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(strCaller));
            }
        }
        //public ObservableCollection<ThePart1> ALLTASKLIST { get; set; }
        public ObservableCollection<ThePart1> ALLTASKLIST = new ObservableCollection<ThePart1>();
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            dbms = new NEGIN1401Entities(Publications.TheENTTConnectionString);

            ALLTASKLIST = dbms.Database.SqlQuery<ThePart1>("SELECT * FROM TCOD_ANBAR").ToObservableCollection();
            var IsHaveItems = ALLTASKLIST.Count;//it will be 6 Items
            //MainDatagrid.ItemsSource = ALLTASKLIST;

        }
    }

数据网格的项目:enter image description here
结果:enter image description here

ulydmbyx

ulydmbyx1#

1.绑定路径需要属性,而不是字段。
1.您的样式将在行级别设置ComboBox的值,并且数据上下文将是集合元素ThePart1,而不是MainWindow。因此,绑定路径将相对于没有ALLTASKLIST属性的ThePart1进行解释。

  1. DataGridComboBoxColumn的一个功能是在创建DataGrid时立即获取源。因此,通常在应用程序资源或静态属性中创建源。
    请尝试以下示例:
    第一个
    我不明白你的第二点,你能说得更清楚些吗?
    为便于理解,请尝试添加此列:
<DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding}"/>
            </DataGrid.Columns>

非常感谢,但只有一件事还没有工作!它是组合框!无法在DataGridTemplateColumn或组合框列的绑定中访问它
没有看到您的代码,我无法判断问题的原因。
我做了一个简单的例子来演示创建和绑定ComboBox列的不同方法。考虑这个例子。也许你会发现一些对你有用的东西,你自己也会明白错误的原因。
第一个
注意第二列--它不是由于绑定错误而创建的,这正是我在第3点中所写的。

niwlg2el

niwlg2el2#

首先你应该绑定到属性,而不是字段。

public ObservableCollection<ThePart1> ALLTASKLIST = new ObservableCollection<ThePart1>();

对此

public ObservableCollection<ThePart1> ALLTASKLIST { get; set; }

我认为您在使用DataGrid的DataContext时遇到了问题。请尝试在XAML中直接将其设置为DataGrid,方法是在XAML中创建一个MainWindow的本地示例。(请参阅EldHasp的问题)
此外,尝试将UpdateSourceTrigger属性设置为PropertyChanged,因为可能列已更新,但如果没有焦点,则无法简单地查看更新。将DataGridAutoGenerateColumns属性设置为false,这样就不会创建新列。

相关问题