使用POCO实现INotifyPropertyChanged

时间:2015-08-18 14:14:28

标签: wpf winrt-xaml xamarin.forms

我不清楚如何连接反映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 事件? 因此,仅仅让类实现INotifyPropertyChanged是不够的。在视图实例化时,将视图模型耦合到视图时,PropertyChanged事件通常会被初始化。

在我的情况下,我需要此实体在其任何属性更改时进行更新。但是,它没有连接到任何绑定系统。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

一般,当sombody附加到它时,事件被“实例化”(变为非空)。

想到以下几点:

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

当您设置Quality属性时,会调用Material.OnPropertyChanged,但PropertyChanged事件为null,因为尚未附加eventhandler。

material.PropertyChanged += Material_PropertyChanged;
material.Quality = 2;

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

xaml 中的

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

因此,您的责任只是触发事件并编写绑定。

答案 2 :(得分:0)

我们需要看到XAML才能理解 - 通常你在XAML和代码中的某处有{Binding Quantity},你在视图模型中有DataContext =。

答案 3 :(得分:-1)