2017-01-21 4 views
1

私のXamarinプロジェクトには、いくつかのプロパティを持つ "Item"オブジェクトを保持するObservableCollectionによって作成されるListViewがあります。アイテムをコレクションに追加するとUIが更新されますが、プロパティのみを変更しても何もしません。アイテムを追加してUIを更新しても、プロパティは正しく変更されますが、何もしません。プロパティが変更された場合、UIを更新するにはどうすればよいですか?ObservableCollectionのプロパティを変更すると何もしません

BindableBaseは、INotifyPropertyChangedとDelegateCommandを実装するPRISMのクラスで、ICommand、btwを実装しています。ここで

は私の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"; 
    } 
} 

そして、私Itemクラス:

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のを実装する必要があるためです。あなたの場合、プリズムを使用しているときは、あなたのアイテムクラスをBindableBase(あなたのために既にINotifyPropertyChangedを実装しているプリズムベースクラス)に拡張する必要があります。

リンク:https://github.com/PrismLibrary/Prism/blob/a60d38013c02b60807e9287db9ba7f7506af0e84/Source/Prism/Mvvm/BindableBase.cs

それを動作させる必要があります。

はまた、私はあなたがこれをやっている中で参照してください。ObservableCollectionsで

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

あなたは、彼らはすでに内部でそれがそうであるように、手動でイベントを発生させる必要はありません。これらは、通常のプロパティとして定義できます。

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

ありがとうございます!これで、プロパティの変更は期待通りに機能します。 ObservableCollectionのヒントもありがとうございます。 – mKay

関連する問題