2015-08-18 68 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事件永遠不會被實例化。 –

相關問題