openLG Ответов: 2

Как привязать свойство "value" "numericupdown" к универсальному свойству класса, который расширяет "list<T>" и, очевидно, реализует интерфейс "inotifypropertychanged" ?


Здравствуйте, у меня есть класс, который расширяется
List<T>
и имеет родовое свойство

public class myClass : System.Collections.Generic.List<String>, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    decimal _myProperty;

    public decimal myProperty
    {
       get { return _myProperty; }
       set
       {
           PropertyChanged(this, new PropertyChangedEventArgs("myProperty"));
           _myProperty = value;
       }
}


Я связываю "свойства myproperty" экземпляра "класса MyClass" на "ценность" собственность "элемент управления numericupdown"

public partial class myForm : Form
{
    myClass x = new myClass();

    public form_RDG3000_1Ch(RDG3000_1Ch rdg)
    {
        InitializeComponent();

        myNumericUpDown.DataBindings.Add("Value", x, "myProperty", false, DataSourceUpdateMode.OnPropertyChanged);
    }


Когда я показываю свою форму, появляется "ArgumentException"

{"Impossibile stabilire l'associazione alla proprietà o alla colonna myProperty di DataSource.
Nome parametro: dataMember"}


Unable to establish the association to the DataSource property or myProperty column.
Parameter name: dataMember


Что я уже пробовал:

Ничего......................

2 Ответов

Рейтинг:
4

BillWoodruff

Добро пожаловать в "скрытые сюрпризы" WinForms :)

Ваш код должен будьте валидны: проблема заключается в том, что ваш класс subclasses List<string> является проблемой. И я был слишком ленив (в течение многих лет), чтобы понять, почему :)

Измените свой класс на:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace TestStruct
{
    public class MyClass : INotifyPropertyChanged
    {

        List<string> MyStrings = new List<string>();

        public event PropertyChangedEventHandler PropertyChanged;

        decimal _myProperty;

        public decimal myProperty
        {
            get { return _myProperty; }
            set
            {
                if (PropertyChanged != null) NotifyPropertyChanged(); 
                _myProperty = value;
            }
        }

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}


BillWoodruff

@openLG вы можете наследовать от ObservableCollection<T> который реализует интерфейсы INotifyCollectionChanged и INotifyPropertyChanged

https://msdn.microsoft.com/en-us/library/ms668604(v=против 110).aspx

Рейтинг:
0

Gerry Schmitz

Или вы можете подписаться на событие "value changed" для числового элемента управления up down (через его класс хоста) и получать уведомления / обновления таким образом. Тот же цикл "перемен".