使用 POCO 实现 INotifyPropertyChanged

Implementing INotifyPropertyChanged with POCO

我不清楚如何连接反映 ListViewItem 绑定上下文的实体。

XAML:

    <ListView x:Name="AssignedMaterialsList" Grid.Row="7" Grid.ColumnSpan="2" ItemsSource="{Binding AssignedMaterials}" SelectedItem="{Binding SelectedAssignedMaterial}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <ViewCell.View>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>

                            <Label Grid.Row="0" Grid.Column="0" Text="{Binding Quantity, StringFormat='({0:F0})'}" />
                            <Label Grid.Row="0" Grid.Column="1" Text="{Binding Name}" />
                            <Label Grid.Row="0" Grid.Column="2" Text="{Binding ., Converter={StaticResource MaterialToCostConverter}, StringFormat='{}{0:c}'}}" />

                            <Label Grid.Row="1" Grid.Column="0" Text="{Binding Description}" />

                        </Grid>
                    </ViewCell.View>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

POCO:

public class Material : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    decimal _quantity = 0.0m;
    public decimal Quantity
    {
        get { return _quantity; }
        set
        {
            if (_quantity != value)
            {
                _quantity = value;
                OnPropertyChanged();
            }
        }
    }

    void OnPropertyChanged([CallerMemberName] string propertyName = "") =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

如何初始化 PropertyChanged 事件? 因此,仅仅让 class 实现 INotifyPropertyChanged 是不够的。 PropertyChanged 事件通常在视图被实例化时将视图模型耦合到视图时被初始化。

但就我而言,我需要此实体在其任何属性发生更改时进行更新。但是,它没有连接到任何绑定系统。

我们需要见到您 XAML 才能理解 - 通常您会在 XAML 中有 {Binding Quantity} 并且在代码的某处,您会在视图中有 DataContext =模型.

您的 class 的消费者负责确定它是否想要订阅 PropertyChanged 事件 - 这通常适用于任何事件驱动的系统 - 消费者可以自由订阅(通过提供处理程序)或忽略它选择的事件。

当您使用通过绑定系统(如 Xamarin Forms)实现 INotifyPropertyChanged 的​​ class 时,绑定机制会自动为 PropertyChanged 事件设置事件处理程序。

Here's an SO post that might help

一般,当有人附加到它时,事件是"instantiated"(变得不为空)。

考虑以下内容:

var material = new Material();
material.Quality = 1;

当您设置质量 属性 时,会调用 Material.OnPropertyChanged,但 PropertyChanged 事件为空,因为还没有附加事件处理程序。

material.PropertyChanged += Material_PropertyChanged;
material.Quality = 2;
再次调用

Material.OnPropertyChanged,但这次PropertyChanged不为null。

在 xaml 中,当您应用绑定时,框架(wpf 或 xamarin 或 silverlight)附加到 PropertyChanged 事件,它是自己的事件处理程序,更新 FrameworkElement 的 属性。该框架还负责从事件中分离以避免内存泄漏。

所以你的责任只是触发事件和编写绑定。