2016-11-30 3 views
0

I持っている私のViewModelにバインドされている以下のGridViewWindowsストアアプリのXAML GridViewのレンダリングされていないデータ

XAMLコード:

<GridView SelectionMode="None" ShowsScrollingPlaceholders="False" HorizontalAlignment="Stretch" Margin="2.5 3" 
      ItemsSource="{Binding ProductList}" Visibility="{Binding IsGridView, Converter={StaticResource BoolToVisibility}}" 
          SizeChanged="SetListItemsWidth" ScrollViewer.VerticalScrollMode="Disabled" 
          ScrollViewer.VerticalScrollBarVisibility="Disabled" VerticalAlignment="Stretch"> 
        <GridView.ItemTemplate> 
         <DataTemplate> 
          <local:ProductListControl Tag="{Binding id}" Margin="3 0 3 3" Tapped="GotoProduct"/> 
         </DataTemplate> 
        </GridView.ItemTemplate> 
       </GridView> 

モデル:

public class ProductC1View : INotifyPropertyChanged 
{ 
public string ScreenTitle 
    { 
     get { return _ScreenTitle; } 
     set 
     { 
      _ScreenTitle = value; 
      OnPropertyChanged("ScreenTitle"); 
     } 
    } 
    public ObservableCollection<ProductDisplay> ProductList { get; set; } 
    } 

のViewModel:

class ProductC1ViewModel : INotifyPropertyChanged 
{ 
    public ProductC1ViewModel() 
    { 
     this.View = new ProductC1View(); 
    } 
    private async void ApplyFilter(object obj) 
    { 
     View.ProductList.Clear(); 
     View.IsProductsAvailable = true; 
    var lstData = await _objController.GetSubCategoryDetails(View); 
     foreach (var product in lstData.catalogs) 
    View.ProductList.Add(_objHelper.FormatProductDisplayDetails(product)); 
    } 
} 

GridViewは、ObservableCollectionにバインドされています。 Intialのロード時や新しいアイテムをコレクションに追加した後は、すべてが正常に動作します。

しかし、データにフィルタを適用してコレクションに新しいアイテムを追加する場合、コレクション内のアイテムをクリアすると、GridViewはデータをレンダリングしません。基礎となるViewModel(ProductList)にはデータが含まれています。私はそれをListViewにバインドすることができ、それは動作します。 Gridviewのためだけにはレンダリングされません

そして、GridviewのItemsPanelをItemsWrapGridからStackPanelに変更すると、その作業はできますが、Stackpanelを使用することはできません。お互いにAmazonのアプリのように。

奇妙なケースは、Windows 8.1の電話アプリでは動作しますが、Windows 10では動作しません。

Expected

+0

'GridViewはデータソースにバインドされていますが、XAMLには' ItemsSource'バインディングがないようです。 ViewModelにコードを投稿できますか?特に、バインディングを設定する方法とクリアを行う方法は? –

+0

Visibility = "{Binding IsGridView ..."これまでにない最高のプロパティー名! Martin Zikmund氏はGridViewにバインディングItemsSourceを設定していないと言っていますので、Gridviewのリフレッシュを担当するRaisePropertyChangedを利用することはできません –

+0

@yanyankelevichコードスニペットのバインディングプロパティを忘れています。 VM、およびモデル データセットのリストタイプビューとグリッドタイプビューを切り替えることができます。したがって、プロパティ "IsGridView" – Prince

答えて

0

一時的な修正がありましたが、Itemspanelをwrapgridに変更しました。現在は動作しています

<GridView.ItemsPanel> 
         <ItemsPanelTemplate> 
          <WrapGrid FlowDirection="LeftToRight" Orientation="Horizontal"></WrapGrid> 
         </ItemsPanelTemplate> 
        </GridView.ItemsPanel> 
0

あなたはProductListセッターでRaisePropertyChangedを(Mvvmlightを要求)を追加する必要があります。

private ObservableCollection<ProductDisplay> _productList; 
public ObservableCollection<ProductDisplay> ProductList 
{ 
    get 
     { 
      return _productList; 
     } 
    set 
     { 
      _productList = value; 
      RaisePropertyChanged(()=>ProductList); 
     } 
} 

それとも、あなたが(このチュートリアルのような)PropertyChangedEventHandlerを実装する必要がINotifyPropertyChangedのと一緒に暮らす:

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

private ObservableCollection<ProductDisplay> _productList; 
public ObservableCollection<ProductDisplay> ProductList 
    { 
     get 
      { 
       return _productList; 
      } 
     set 
      { 
       _productList = value; 
       NotifyPropertyChanged(); 
      } 
    } 

そして、あなたは必要ない絵のタイルを表示するためのGridViewを必要とする:

<ListBox ItemsSource="{Binding AllDesignSheetsInDB}" SelectedItem="{Binding CurrentDesignSheet}" BorderBrush="LightGray" BorderThickness="2" ScrollViewer.HorizontalScrollBarVisibility="Disabled" > 
    <ItemsPanelTemplate> 
     <WrapPanel /> 
    </ItemsPanelTemplate> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <local:ProductListControl Tag="{Binding id}" Margin="3 0 3 3" Tapped="GotoProduct"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

これは機能していないと思われます。基本的なProductListにはデータがあり、それをListviewに表示すると、問題はWindows 10デバイスのGridviewでのみ発生します。 – Prince

+0

そして、ItemsWindowのItemsPanelをItemsWrapGridからStackpanelが動作していますが、Stackpanelを使用することはできません。なぜなら、隣り合わせに積み重ねられた1つのアイテムでリストを表示したいからです。 – Prince

+0

私は実際にその "INotifyPropertyChanged"を実行している、問題は、GridViewのItemsPanelであると思われるので、ItemsWindowのItemsPanelをItemsWrapGridからStackPanelに変更し、リストを必要とするため、StackPanelを使用できない。互いに隣り合う1つのアイテムによって表示される。 – Prince

関連する問題