为了使UI收到通知,以下代码示例中的属性“ Difference”已更改的正确方法是什么?

该属性是只读的。必须始终根据其他属性计算属性的值。

MainWindow.xaml:

<Window x:Name="winCalcs" x:Class="BindingList.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:m="clr-namespace:BindingList"
        Title="Calculations" Height="350" Width="525">
    <Window.Resources>
        <m:OperationList x:Key="OperationData"/>
        <CollectionViewSource x:Key="Operations"
                              Source="{StaticResource ResourceKey=OperationData}"/>
    </Window.Resources>

    <Grid>
        <TabControl x:Name="tabsMain">
            <TabItem x:Name="tab01" Header="Tab 1">
                <DataGrid x:Name="dg01"
                          ItemsSource="{Binding
                    Source={StaticResource ResourceKey=Operations},
                    UpdateSourceTrigger=PropertyChanged}" />
            </TabItem>
            <TabItem x:Name="tab02" Header="Tab 2">
                <DataGrid x:Name="dg02"
                          ItemsSource="{Binding
                    Source={StaticResource ResourceKey=Operations},
                    UpdateSourceTrigger=PropertyChanged}" />
            </TabItem>
        </TabControl>
    </Grid>

</Window>


Operation.cs:

namespace BindingList
{
    class Operation : INotifyPropertyChanged
    {
        private float _minuend;

        private float _subtrahend;

        public float Minuend
        {
            get
            {
                return this._minuend;
            }
            set
            {
                if (this._minuend == value) return;
                this._minuend = value;
                this.NotifyPropertyChanged("Minuend");
            }
        }

        public float Subtrahend
        {
            get
            {
                return this._subtrahend;
            }
            set
            {
                if (this._subtrahend == value) return;
                this._subtrahend = value;
                this.NotifyPropertyChanged("Subtrahend");
            }
        }

        public float Difference
        {
            get
            {
                return Minuend - Subtrahend;
            }
            private set {}
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string p)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(p));
        }
    }
}


OperationList.cs:

namespace BindingList
{
    class OperationList : BindingList<Operation>
    {
        public OperationList()
        {
            Add(new Operation());
        }
    }
}

最佳答案

当Minuend或Subtrahend更改时,差异也会更改。这意味着您需要在Minuend或Subtrahend的集合中通知更改的差异。

无需为差异设置属性。

附带一提,无需在任何地方都使用this

public float Minuend
{
    get
    {
        return _minuend;
    }
    set
    {
        if (_minuend == value) return;
        _minuend = value;
        NotifyPropertyChanged("Minuend");
        NotifyPropertyChanged("Difference");
    }
}

public float Subtrahend
{
    get
    {
        return _subtrahend;
    }
    set
    {
        if (_subtrahend == value) return;
        _subtrahend = value;
        NotifyPropertyChanged("Subtrahend");
        NotifyPropertyChanged("Difference");
    }
}

public float Difference
{
    get
    {
        return Minuend - Subtrahend;
    }
}

09-27 16:03