2015-08-18 2 views
0

Мне не ясно, как подключить объект, который отражает контекст привязки ListViewItem.Реализация INotifyPropertyChanged с помощью POCO

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> 

ПОКО:

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

Мой вид связан непосредственно с виртуальной машиной. У VM есть наблюдаемая коллекция poco, в которой мне нужно мое представление, чтобы отражать обновления на основе изменений стоимости собственности в моем poco. –

ответ

1

Потребитель вашего класса несет ответственность за определение того, хочет ли он подписаться на событие PropertyChanged - это, как правило, справедливо для любой управляемой событиями системы - потребитель может свободно подписываться (предоставляя обработчик) или игнорировать событие, которое он выбирает.

Когда вы используете класс, который реализует INotifyPropertyChanged с помощью системы привязки (например, Xamarin Forms), механизм привязки автоматически устанавливает обработчик событий для событий PropertyChanged.

+0

Спасибо за информацию. Событие PropertyChanged моего poco никогда не инициализируется. Событие PropertyChanged объекта ViewModel инициализируется. Есть ли какой-нибудь код, который вы можете показать мне, как инициализировать событие PropertyChanged в poco? –

0

Нам нужно увидеть, как вы XAML понимаете - обычно у вас будет {Binding Quantity} в XAML и где-то в вашем коде, у вас будет DataContext = в модели представления.

1

вообще, событие "конкретизируется" (становится не нулевым), когда Sombody прикрепляет к нему.

думать о следующем:

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

когда вы установите свойство качества, Material.OnPropertyChanged называется, но PropertyChanged событие является недействительным, поскольку нет EventHandler прилагается еще.

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

Material.OnPropertyChanged вызывается снова, но на этот раз PropertyChanged не является нулевым.

в XAML, когда вы применяете связывание, рамки (либо МОФ или Xamarin или Silverlight) придает PropertyChanged событию свой собственный EventHandler, который обновляет свойство FrameworkElement в. Структура также отвечает за отсоединение от события, чтобы избежать утечек памяти.

Таким образом, ваша ответственность заключается только в том, чтобы инициировать событие и записывать привязки.

+0

Спасибо за информацию. Тем не менее, я все еще изо всех сил пытаюсь понять, что мне нужно сделать, чтобы мой элемент отражал изменения в ListView. Опять же, событие PropertyChanged в объекте никогда не создается. –

Смежные вопросы