Невозможно связать унаследованный класс с сетью данных wpf C#

//In Test.xaml 

 <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="30"></RowDefinition>
        </Grid.RowDefinitions>
        <DataGrid  Grid.Row="0"  AutoGenerateColumns="False" ItemsSource="{Binding}"   Name="dtGridTran" HorizontalAlignment="Left"   CanUserAddRows="True"   >
            <DataGrid.Columns>
                <DataGridTextColumn Header="X" Binding="{Binding Path=X, UpdateSourceTrigger=PropertyChanged}"   Width="200"/>               
                <DataGridTextColumn Header="Y" Binding="{Binding Path=Y, UpdateSourceTrigger=PropertyChanged}" Width="200"  />
            </DataGrid.Columns>
        </DataGrid>
        <Label Grid.Row="1" Content=" Total Sum of x and Y">

        </Label>
        <TextBox  Grid.Row="1" Text="{Binding Path=Total, UpdateSourceTrigger=PropertyChanged}" Margin="150,0,0,0" Width="100"></TextBox>       
    </Grid>

//In Test.xaml.cs file
public partial class Test : Page
    {

        Derivedclass D = new Derivedclass();
        public Test()
        {
            InitializeComponent();
            this.DataContext = D;
            dtGridTran.ItemsSource = new TestGridItems();
        }

    }

public class TestGridItems : List<Derivedclass>
{
}

// In Base class
public class Baseclass : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private int mTotal = 0;
        private int mID = 0;

        public int Total
        {
            get { return mTotal; }
            set
            {
                mTotal = value; OnPropertyChanged("Total");
            }
        }
        public int ID
        {
            get { return mID; }
            set { mID = value; }
        }
        public string Item = "xxx";
        // Create the OnPropertyChanged method to raise the event 
        protected void OnPropertyChanged(string PropertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(PropertyName));
            }
        }

    }

In Derivedclass.cs

    public class Derivedclass : Baseclass, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private int mX = 0;
        private int mY = 0;
        public int X
        {
            get { return mX; }
            set
            {
                mX = value;
                base.Total = base.Total + mX;
                                OnPropertyChanged("Total");

            }
        }
        public int Y
        {
            get { return mY; }
            set
            {
                mY = value;
                base.Total = base.Total + mY;
                OnPropertyChanged("Total");
            }
        }
         // Create the OnPropertyChanged method to raise the event 
        protected void OnPropertyChanged(string PropertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(PropertyName));
            }
        }
    }
}

Здесь я пытаюсь найти общую сумму значений х и у. но я получаю общую сумму ноль. Общая собственность в базовом классе. я хочу, чтобы общая сумма столбцов x и y отображалась в текстовом поле... но свойство Total базового класса возвращало ноль при добавлении нескольких значений.

2 ответа

Total вы показываете, принадлежит к одному объекту D, который вы создаете первым, но нет связи с вашим списком DerivedClasses (который, я должен сказать, вы странно оборачиваете как отдельный класс). Тот факт, что существует базовый класс, не означает, что его свойства будут хранить значения "глобально", поэтому любой экземпляр может их прочитать. static свойство будет действовать как единое целое, но в описываемом вами сценарии будет более целесообразно назначить новое свойство / переменную вне ваших классов, которые будут представлять собой сумму. Кроме того, сложение чисел в установщике не будет работать хорошо, так как оно зарегистрирует любые изменения значений, и вы можете в конечном итоге добавить одно и то же свойство несколько раз (если только это не то, чего вы пытаетесь достичь...).

Редактировать:

Для начала я бы создал класс ViewModel, который DataContext будет связывать с:

public class MyViewModel : INotifyPropertyChanged
{
    // backing fields, etc...

    public List<DerivedClass> Items
    {
        get { return items; }
        set
        {
            items = value;
            OnPropertyChanged("Items");
        }
    }

    public int Sum
    {
        get
        {
            return this.Items != null ? this.Items.Sum(i => i.X + i.Y) : 0;
        }
    }

   ...       

   public void PopulateItems()
   {
       this.Items = MyMethodToGetItems();
       foreach (var item in this.Items)
       {
           item.PropertyChanged += this.ItemPropertyChanged;
       }
   }

    private void ItemPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
    {
        if (propertyChangedEventArgs.PropertyName == "X" || propertyChangedEventArgs.PropertyName == "Y")
        {
            OnPropertyChanged("Sum");
        }
    }
}

в PopulateItems метод он подпишется на PropertyChaned событие каждого элемента в коллекции. Если свойство, которое вызвало четное число, имеет значение X или Y, оно вызовет другое событие для пересчета суммы (ItemPropertyChanged).

Я считаю, что проблема, с которой вы столкнулись, заключается в том, что из-за отдельных реализаций INotifyPropertyChanged удалили реализацию из DerivedClass, и все должно быть в порядке, привязка автоматически перехватывает событие PropertyChanged для классов, но поскольку это событие отличается от базового класса, не перехватывает какие-либо события PropertyChanged базового класса, которые запускаются.

Таким образом, DerivedClass должен выглядеть так

public class Derivedclass : Baseclass
{
    private int mX = 0;
    private int mY = 0;
    public int X
    {
        get { return mX; }
        set
        {
            mX = value;
            base.Total = base.Total + mX;
            OnPropertyChanged("Total");

        }
    }
    public int Y
    {
        get { return mY; }
        set
        {
            mY = value;
            base.Total = base.Total + mY;
            OnPropertyChanged("Total");
        }
    }
}

Если вы посмотрите на предупреждения, которые визуальная студия выдает вам, она, вероятно, говорила вам об этом "метод переопределяет не виртуальный метод базового класса, делает метод базового класса виртуальным или использует ключевое слово new"

Кроме того, я думаю, что ваш общий расчет испорчен, вы всегда добавляете к итогу, а не просто делаете X + Y.

Другие вопросы по тегам