2017-01-21 3 views
1

В моем проекте Xamarin у меня есть ListView, который заполняется ObservableCollection, который содержит объекты Item с некоторыми свойствами. Если я добавлю элементы в коллекцию, пользовательский интерфейс будет обновлен, но если я изменю только свойство, он ничего не сделает. Даже после обновления пользовательского интерфейса при добавлении элемента ничего не происходит, хотя свойство корректно изменяется. Как я могу обновить пользовательский интерфейс, если свойство изменено?Изменение свойства ObservableCollection ничего не делает

BindableBase - это класс от PRISM, который реализует INotifyPropertyChanged и DelegateCommand реализует ICommand, кстати.

Вот мой XAML:

<ListView ItemsSource="{Binding ListItems}"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <ViewCell x:Name="viewCell"> 
        <ContentView Padding="0,0,0,5" 
            HeightRequest="50"> 
         <ContentView.GestureRecognizers> 
          <TapGestureRecognizer BindingContext="{Binding Source={x:Reference listView}, Path=BindingContext}" 
                 Command="{Binding ItemTappedCommand}" 
                 CommandParameter="{Binding Source={x:Reference viewCell}, Path=BindingContext}" /> 
         </ContentView.GestureRecognizers> 
         <Frame OutlineColor="{Binding Color}" Padding="8"> 
          <StackLayout Orientation="Horizontal" > 
           <Image x:Name="checkedImage" 
             HeightRequest="30" 
             WidthRequest="30" 
             BackgroundColor="{Binding Color}" 
             /> 
           <Label Text="{Binding Text}" 
             TextColor="{Binding Color}" 
             Margin="20,0,0,0" 
             VerticalTextAlignment="Center" 
             HorizontalOptions="FillAndExpand"/> 
           <Image Source="{Binding Image}" /> 
          </StackLayout> 
         </Frame> 
        </ContentView> 
       </ViewCell> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

Вот мой ViewModel:

public class DetailPageViewModel : BindableBase 
{ 
    public DetailPageViewModel() 
    { 
     _listItems.Add(new ViewModels.Item("#123456", "Test1", "XamarinForms.Assets.Yellow.png")); 
     _listItems.Add(new ViewModels.Item("#654321", "Test3", "XamarinForms.Assets.close.png")); 
    } 

    private ObservableCollection<Item> _listItems = new ObservableCollection<Item>(); 

    public ObservableCollection<Item> ListItems 
    { 
     get { return _listItems; } 
     set { SetProperty(ref _listItems, value); } 
    } 

    public DelegateCommand<Item> ItemTappedCommand => new DelegateCommand<Item>(ItemTapped); 

    private void ItemTapped(Item listItem) 
    { 
// Adding an item refreshes the UI. 

     _listItems.Add(new ViewModels.Item("#654321", "Test3", "XamarinForms.Assets.close.png")); 

// But changing the color of an item does nothing. Not even after an UI refresh. 

     _listItems.ElementAt(_listItems.IndexOf(listItem)).Color="#987654"; 
    } 
} 

И мой Пункт Класс:

public class Item 
{ 
    public string Color { set; get; } 
    public ImageSource Check { set; get; } 
    public string Text { private set; get; } 
    public ImageSource Image { private set; get; } 


    public Item(string color, string text, string imageSource) 
    { 
     Check = ImageSource.FromResource("XamarinForms.Assets.checkmark-outlined-verification-sign.png"); 

     Color = color; 
     Text = text; 
     Image = ImageSource.FromResource(imageSource); 
    } 

} 

ответ

1

Это потому, что и ваш класс элемент должен реализовать INotifyPropertyChanged. В вашем случае, когда вы используете Prism, вам просто нужно сделать свой класс предметов расширенным BindableBase (базовый класс Prism, который уже реализует для вас INotifyPropertyChanged).

Ссылка: https://github.com/PrismLibrary/Prism/blob/a60d38013c02b60807e9287db9ba7f7506af0e84/Source/Prism/Mvvm/BindableBase.cs

Это должно заставить его работать.

Также я вижу вы делаете это:

public ObservableCollection<Item> ListItems 
{ 
    get { return _listItems; } 
    set { SetProperty(ref _listItems, value); } 
} 

С ObservableCollections вам не нужно поднимать событие вручную, так как они уже делают это внутренне. Их можно определить как регулярные свойства.

public ObservableCollection<Item> ListItems {get; set;} 
+0

Спасибо! Теперь изменение свойств работает так, как ожидалось. И спасибо за наконечник с ObservableCollection. – mKay

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