0
//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 値の合計を見つけようとしています。しかし、m は合計ゼロを取得します。合計プロパティは基本クラスにあります。テキストボックスに表示したい x 列と y 列の合計が必要ですが、複数の値を追加している間、ベースクラスの Total プロパティはゼロを返します。

4

2 に答える 2

1

あなたTotalが表示しているは、最初に作成した単一の D オブジェクトに属していますが、リストへの接続はDerivedClassesありません (別のクラスとして奇妙にラップしていると言わざるを得ません)。基本クラスがあるからといって、そのプロパティが値を「グローバルに」保存するわけではないため、どのインスタンスでもそれらを読み取ることができます。プロパティは1staticつとして機能しますが、説明しているシナリオでは、合計を表すクラス外の新しいプロパティ/変数を指定する方が理にかなっています。その上、セッターで数値を合計すると、値の変更が登録され、同じプロパティを複数回追加する可能性があるため、うまく機能しません (これが達成しようとしている場合を除きます...)。

編集:

DataContextまず、ページがバインドされるViewModel クラスを作成します。

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)。

于 2014-10-28T11:34:43.893 に答える