我不清楚如何连接反映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事件通常会被初始化。
在我的情况下,我需要此实体在其任何属性更改时进行更新。但是,它没有连接到任何绑定系统。
答案 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)