2015-08-18 43 views
0

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

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

bleh,这些“表达式”的方法定义很难看:) – Liero

+0

您的视图是直接绑定到您的POCO还是VM?如果它是一个VM,VM和POCO之间的关系是什么?我认为你需要展示更多的代码,以便了解你的绑定是如何设置的。 – Jason

+0

我的视图直接绑定到虚拟机。虚拟机有一个可观察的poco集合,我需要我的视图来反映基于poco中属性值更改的更新。 –

回答

1

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

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

+0

感谢您的信息。我的poco的PropertyChanged事件从未被初始化。我的ViewModel的PropertyChanged事件被初始化。是否有任何代码可以告诉我如何初始化poco的PropertyChanged事件? –

0

我们需要了解XAML以了解 - 通常情况下,您在XAML中和代码中的某处会有{绑定数量},您将在视图模型中使用DataContext =。

1

一般,事件被 “实例”(变得不空)时sombody重视它。

想到以下的:因为没有尚未连接的事件处理程序

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

当你设置质量属性,Material.OnPropertyChanged叫,但PropertyChanged事件为null。

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

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

在XAML,当你申请绑定,框架(无论是WPF或xamarin或Silverlight)重视PropertyChanged事件它自己的事件处理程序,即更新FrameworkElement的财产。该框架还负责从事件中分离以避免内存泄漏。

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

+0

感谢您的信息。但是,我仍然在努力弄清楚我需要做什么来让我的项目反映ListView中的更改。同样,实体上的PropertyChanged事件永远不会被实例化。 –

相关问题