用户可编辑的数据网格具有空行,即使observableCollection为空

我正在使用数据网格,并通过TwoWay绑定将其绑定到可观察的集合。 我的目标是,用户从空集合开始生成数据列表。 所以我启用了选项CanUserAddRow。

在代码中,我使用以下代码生成了可观察的集合:

private ObservableCollection<Ticket> idlessTicketList = new ObservableCollection<Ticket>();

ObservableCollection组成的Ticket类如下所示:

public class Ticket
{
    public Ticket() { }

    public bool ticketUsed { get; set; }
    public string ticketNumber { get; set; }
    public string ticketCustomer { get; set; }
    public string ticketText { get; set; }
    public double ticketTime { get; set; }
    public Decimal ticketTypeNr { get; set; }
    public string ticketTypeText { get; set; }

}

在MainWindow方法中,将Datagrid的itemSource设置为ObservableCollection:

public MainWindow()
{

    InitializeComponent();
    gridIdlessTickets.ItemsSource = idlessTicketList;

}

我的问题是,启动时未显示添加新行的空行。 如果通过代码myGridd.Add(row)添加新行,则空行将正确显示,并且一切正常。

如何将ObservableCollection初始化并正确引用到itemSource? 初始化itemSource的最佳位置在哪里?

预先感谢

youxiwangluo 回答:用户可编辑的数据网格具有空行,即使observableCollection为空

这应该为您工作。让我知道它是否有帮助:

XAML:

var data_point={
  x:dateObject,y:parseFloat(val.sa_quantity)
};
datapoints.push(data_point);

背后的代码(.xaml.cs):

var chartData = [];
      var ctxR = document.getElementById("data_chart").getContext('2d');
      var myChart = new Chart(ctxR,{
        type: 'scatter',data: {
          labels:dates,datasets: [{
            label: 'Predicted Sales($)',data: datapoints
          }]
        },responsive: true,title:{
                display: true,text:"Chart.js Time Scale"
            },scales:{
                xAxes: [{
                  type: 'time',time: {
                    displayFormats: {
                      'millisecond': 'MMM DD','second': 'MMM DD','minute': 'MMM DD','hour': 'MMM DD','day': 'MMM DD','week': 'MMM DD','month': 'MMM DD','quarter': 'MMM DD','year': 'MMM DD',},round: 'day',unit: 'day',}
                }]
            }
        });
        myChart.update();

ViewModel:(MainWindowViewModel.cs)

    <Window>
      <Grid>
        <Datagrid ItemsSource="{Binding idlessTicketList }" SelectionMode="Single" SelectionUnit="Cell" IsReadOnly="False" 
                  CanUserAddRows="True" CanUserDeleteRows="False" AutoGenerateColumns="False">

        //ColumnDefinition...etc
                <DataGridTextColumn Header="TicketNumber" Binding="{Binding TicketNumber}"  />
                <DataGridTextColumn Header="TicketCustomer" Binding="{Binding TicketCustomer}"
        </Datagrid>
<Button name="ThisIsYourUpdateButton" Command="{Binding UpdateMyTicket}" Width="200" Content="Update me now"/>
      </Grid>
    </Window>

添加public MainWindow() { InitializeComponent(); //parses the XAML... DataContext = new MainWindowViewModel(); //outsources the view code to the //"controller" to make the view only display and nothing else... } 类,如下:

        using System;
        using System.Collections.ObjectModel;
        using System.ComponentModel;
        using System.Windows;

        namespace YourNameSpace
        {
            public class MainWindowViewModel : INotifyPropertyChanged
            {
                public ICommand UpdateMyTicket => new DelegateCommand<object>(ExecuteUpdateTicket);
                public Ticket TicketInstance {get;set;}
                public event PropertyChangedEventHandler PropertyChanged;
                public virtual void OnPropertyChanged(string propertyName)
                {
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
                    }
                }

                private ObservableCollection<Ticket> _idlessTicketList;
                public ObservableCollection<Ticket> idlessTicketList
                {
                    get { return _idlessTicketList; }
                    set
                    {
                        _idlessTicketList = value;
                        OnPropertyChanged("idlessTicketList");
                    }
                }

                //Constructor
                public MainWindowViewModel()
                {
                    idlessTicketList = new ObservableCollection<Ticket>();
                }
                public void ExecuteUpdateTicket(obj param)
                {
                  //if the button is clicked you update your Ticket class properties here!
                }
             }
          }
,

使用单独的View-Model类初始化observablecollection,可以正确显示空行。 但是数据不再更新。 这是我所做的:

我将新类添加为新的命名空间

xmlns:vm =“ clr-namespace:nsMainWindowViewModel”

绑定是这样写的:

<DataGrid ItemsSource="{Binding Path=idlessTicketList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  AutoGenerateColumns="False" >
       <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Mode=TwoWay,Path=ticketCustomer,UpdateSourceTrigger=PropertyChanged}"/>
            <DataGridTextColumn Binding="{Binding Mode=TwoWay,Path=ticketText,Path=ticketTime,UpdateSourceTrigger=PropertyChanged,StringFormat=\{0:n2\}}"/>
       </DataGrid.Columns>
</Datagrid>

通过此实现,在应用程序启动时调用PropertyChangedEventHandler,但不会更改元素。

绑定必须如何编写? 对于我尝试过的datagrid:

{Binding Path=(idlessTicketList),UpdateSourceTrigger=PropertyChanged}
{Binding Path=(vm:idlessTicketList),UpdateSourceTrigger=PropertyChanged}
{Binding Path=(vm:MainWindowViewModel.idlessTicketList),UpdateSourceTrigger=PropertyChanged}

以及我尝试过的列;

{Binding Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
{Binding Mode=TwoWay,Path=(vm:ticketCustomer),Path=(vm:MainWindowViewModel.ticketCustomer),UpdateSourceTrigger=PropertyChanged}

调试结束后,我可以看到最初调用了PropertyChange方法,但是在编辑单个元素之后却没有。

必须如何定义绑定才能在另一个命名空间中更新te observableCollection?

预先感谢

本文链接:https://www.f2er.com/3121191.html

大家都在问