使用 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 的 属性。该框架还负责从事件中分离以避免内存泄漏。
所以你的责任只是触发事件和编写绑定。
我不清楚如何连接反映 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 的 属性。该框架还负责从事件中分离以避免内存泄漏。
所以你的责任只是触发事件和编写绑定。