Функция ViewModel имеет недопустимые аргументы - PullRequest
0 голосов
/ 18 июня 2020

У меня есть программа, которая получает данные из json, помещает их в список, и я могу нажать кнопку refre sh, чтобы получить новые данные. Когда я нажимаю кнопку в первый раз, я получаю данные, но если я нажимаю ее снова, я получаю следующее: «Лучшее совпадение перегруженного метода для MyApp.ViewModels.TableViewModel.UpdateWithModel (MyApp.Model.TableModel)» имеет недопустимые аргументы »

TableModel.cs (модель)

 public class TableModel
    {
        public string Name { get; set; }
        public Data data { get; set; }
        public string Unit { get; set; }

    }
    public class Data
    {
        public double x { get; set; }
        public double y { get; set; }
        public double z { get; set; }
    }

TableViewModel.cs (ViewModel)

using Model;
    public class TableViewModel : INotifyPropertyChanged
    {
        private string _name;
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                if (_name != value)
                {
                    _name = value;
                    OnPropertyChanged("Name");
                }
            }
        }

        private double _x;
        public string X
        {
            get
            {
                return _x.ToString("0.0####", CultureInfo.InvariantCulture);
            }
            set
            {
                if (Double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out double tmp) && _x!= tmp)
                {
                    _x= tmp;
                    OnPropertyChanged("x");
                }
            }
        }

        private double _y;
        public string Y
        {
            get
            {
                return _y.ToString("0.0####", CultureInfo.InvariantCulture);
            }
            set
            {
                if (Double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out double tmp) && _y!= tmp)
                {
                    _y= tmp;
                    OnPropertyChanged("Y");
                }
            }
        }

        private double _z;
        public string Z
        {

            get
            {
                return _z.ToString("0.0####", CultureInfo.InvariantCulture);
            }
            set
            {
                if (Double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out double tmp) && _z!= tmp)
                {
                    _z= tmp;
                    OnPropertyChanged("Z");
                }
            }
        }

        private string _unit;
        public string Unit
        {
            get
            {
                return _unit;
            }
            set
            {
                if (_unit != value)
                {
                    _unit = value;
                    OnPropertyChanged("Unit");
                }
            }
        }


        public TableViewModel(TableModel model)
        {
            UpdateWithModel(model);
        }

        public void UpdateWithModel(TableModel model)
        {
            _name = model.Name;
            OnPropertyChanged("Name");
            _unit = model.Unit;
            OnPropertyChanged("Unit");
            _x= model.data.x;
            OnPropertyChanged("x");
            _y= model.data.y;
            OnPropertyChanged("y");
            _z= model.data.z;
            OnPropertyChanged("z");
        }

        #region PropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        /**
         * @brief Simple function to trigger event handler
         * @params propertyName Name of ViewModel property as string
         */
        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion

    }

MainViewModel.cs (ViewModel)

public ObservableCollection<TableViewModel> NewMeasurements { get; set; }

public ButtonCommand RefreshFnc { get; set; }

private tableServer iotTable = new tableServer();


void RefreshData()
        {
            // Read data from server in JSON array format
            dynamic measurementsJsonArray = iotTable.getMeasurements();

            // Convert generic JSON array container to list of specific type
            dynamic measurementsListA = measurementsJsonArray.ToObject<List<TableModel>>();

            // Add new elements to collection
            if (NewMeasurements.Count < measurementsListA.Count)
            {
                foreach (var m in measurementsListA)
                    NewMeasurements.Add(new TableViewModelOri(m));
            }
            // Update existing elements in collection
            else
            {
                for (int i = 0; i < NewMeasurements.Count; i++)
                {
                    NewMeasurements[i].UpdateWithModel(measurementsListA);
                }
            }
        }

РЕДАКТИРОВАТЬ

в этой строке NewMeasurements[i].UpdateWithModel(measurementsListA); Я только что заменил sizesListA на sizeslistA [i], и это сработало.

Спасибо за ответы, обязательно присмотрю тип Dynami c.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Похоже, ваш метод ожидает TableModel

public void UpdateWithModel(TableModel model)

Но вы пытаетесь дать ему список

dynamic measurementsListA = measurementsJsonArray.ToObject<List<TableModel>>();
NewMeasurements[i].UpdateWithModel(measurementsListA);

Edit

Как сказано в комментарии .Do c, опасно использовать тип «Dynami c», если в этом нет необходимости. С типом stati c вы столкнетесь с проблемой компилятора вместо проблемы во время выполнения.

0 голосов
/ 18 июня 2020

В следующем коде:

for (int i = 0; i < NewMeasurements.Count; i++)
{
    NewMeasurements[i].UpdateWithModel(measurementsListA);
}

... вы передаете measurementsListA, который является списком, а UpdateModel ожидает объект TableModel.

Во время first refre sh ошибка не появляется, так как NewMeasurements пуст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...