繁体   English   中英

数据绑定 ObservableCollection<Object> 到 DataGrid WPF C#

[英]Databind ObservableCollection<Object> to DataGrid WPF C#

我在命名空间 Dca.KnxPanel.View 中有一个 xaml 页面,其 Datagrid 定义为

<DataGrid Grid.Row="2" Grid.Column="2"  Name="GroupAddressDataGrid" ItemsSource="{Binding Source={x:Static viewModel:DcaAppVm._ProjectGroupAddress}}" AutoGenerateColumns="False" Margin="14,0,-14,0" Grid.RowSpan="2" >
    <Border Background="GhostWhite" BorderBrush="Gainsboro" BorderThickness="1">
    </Border>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Group Address"  Binding="{Binding Path=Address_Value}" Width="Auto"/>
        <DataGridTextColumn Header="Description" Binding="{Binding Path=Datapoint_Name}" Width="Auto"/>
        <DataGridTextColumn Header="Length" Binding="{Binding Path=Datapoint_Object_Size}" Width="Auto"/>
    </DataGrid.Columns>
</DataGrid>

其中 DCA_GroupAddressList 和 DCA_GroupAddress 在命名空间 Dca.KnxPanel.Model 中定义

namespace Dca.KnxPanel.Model
{
    [DebuggerDisplay("{Address_Value} {Datapoint_Name} {Datapoint_Object_Size}")]
    public class DCA_GroupAddress
    {
        public DCA_GroupAddress(GroupAddress data) {
            Address_Value = data.AddressValue.ToString();
            Datapoint_Name = data.Name;
            if (data.ObjectSize != null)
            {
                Datapoint_Object_Size = data.ObjectSize.Value;
            }
        }

        public string Address_Value { get; set; }
        public string Datapoint_Name { get; set; }
        public ObjectSize Datapoint_Object_Size { get; set; }

    }

    public class DCA_GroupAddressList : ObservableCollection<DCA_GroupAddress>
    {

        public static DCA_GroupAddressList dca_groupaddresslist { get; set; }

        public void Add(GroupAddress item)
        {
            this.Add(new DCA_GroupAddress(item));
            this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
        }

        protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            if (e.Action != null)
            {
                base.OnCollectionChanged(e);
            }
        }
    }
}

问题是 DataGrid 中的绑定数据不起作用,但我不明白为什么......

你能帮助我吗?

我尝试了很多解决方案,最后这是可行的:

<DataGrid Grid.Row="2" Grid.Column="2"  Name="GroupAddressDataGrid" ItemsSource="{Binding _ProjectGroupAddress}" AutoGenerateColumns="False" Margin="14,0,-14,0" Grid.RowSpan="2" >
                            <Border Background="GhostWhite" BorderBrush="Gainsboro" BorderThickness="1">
                            </Border>
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Group Address"  Binding="{Binding Path=Address_Value}" Width="Auto"/>
                                <DataGridTextColumn Header="Description" Binding="{Binding Path=Datapoint_Name}" Width="Auto"/>
                                <DataGridTextColumn Header="Length" Binding="{Binding Path=Datapoint_Object_Size}" Width="Auto"/>
                            </DataGrid.Columns>
                        </DataGrid>

DCA_GroupAddress 类现在是:

 public class DCA_GroupAddress : INotifyPropertyChanged
    {
        private string address_value, datapoint_name;
        private ObjectSize datapoint_object_size;

        public DCA_GroupAddress(GroupAddress data) {
            Address_Value = data.AddressValue.ToString();
            Datapoint_Name = data.Name;
            if (data.ObjectSize != null)
            {
                Datapoint_Object_Size = data.ObjectSize.Value;
            }
        }

        public string Address_Value { 
            get { return address_value; }
            set {
                address_value = value;
                OnPropertyChanged(new PropertyChangedEventArgs("address_value")); 
            } 
        }
        public string Datapoint_Name
        {
            get { return datapoint_name; }
            set
            {
                datapoint_name = value;
                OnPropertyChanged(new PropertyChangedEventArgs("datapoint_name")); 
            }
        }
        public ObjectSize Datapoint_Object_Size
        {
            get { return datapoint_object_size; }

            set
            {
                datapoint_object_size = value;
                OnPropertyChanged(new PropertyChangedEventArgs("datapoint_object_size"));
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, e);
            }
        }
    }

我已经定义了一个容器

public ObservableCollection<DCA_GroupAddress> _ProjectGroupAddress { get; set; } = new ObservableCollection<DCA_GroupAddress>();

我的问题是为什么我需要添加这些代码

            GroupAddressDataGrid.Items.Clear();
            GroupAddressDataGrid.ItemsSource = _ProjectGroupAddress;

在 UI 类构造函数中? 似乎在创建 DataGrid 时 Items 不为空,因此软件不使用 ItemsSource。 我需要在绑定工作之前清除项目...

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM