2017-10-27 13 views
1

MVVM WPFで作業しています。私はlistBoxをポップアップパネルに含めています。ポップアップが表示されますが、リストボックスは塗りつぶされません。理想的な理由はありません。リストボックスは、データの列をフィルタリングするために使用されます。MVVMにコンボボックスのリストが設定されていません

<ListBox x:Name="listBoxPopupContent" ItemsSource="{Binding ClassViewMethod}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding ClassName}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 

とモデルビュー:

public ObservableCollection<ClassView> ClassViewMethod 
    { 
     get 
     { 
      foreach (string cust in ClassViewItems.Select(w => w.ClassName).Distinct().OrderBy(w => w)) 
      { 
       classFilters.Add(new CheckedListItem<string> { Item = cust, IsChecked = true }); 
      } 
      viewSource.Filter += viewSource_Filter; 
      viewSource.Source = ClassViewItems; 
      return ClassViewItems; 
     } 
    } 

    private void viewSource_Filter(object sender, FilterEventArgs e) 
    { 
     ClassView cust = (ClassView)e.Item; 

     int count = classFilters.Where(w => w.IsChecked).Count(w => w.Item == cust.ClassName); 

     if (count == 0) 
     { 
      e.Accepted = false; 
      return; 
     } 

     e.Accepted = true; 
    } 

    public ObservableCollection<ClassView> ClassViewItems 
    { 
     get 
     { 
      return _classView; 
     } 

     set 
     { 
      _classView = value; 
      NotifyPropertyChanged("ClassViewItems"); 

     } 

のDataContextは(app.xamlに)ように設定されている:

<Application.Resources> 
    <local:MainWindowViewModel x:Key="MainWindowViewModel" /> 
</Application.Resources> 

とMainWindow.xamlに:ここでリストボックスがある

DataContext="{StaticResource MainWindowViewModel}" 
+1

上のすべてのことを示しています。 MainWindowViewModelは、MainWindowのビューモデルです。だから、XAMLのMainWindowのコンストラクタでは、WindowsのDataContextプロパティに割り当てて、ビューモデルを作成してアタッチすることができます。しかしここでは、MainWindowViewModelに独自のDataContextプロパティがあります。そして、あなたのMainWindowViewModelのプロパティであるかのようにコントロール(lstClassName、grdData、...)を割り当てています。 MainWindowとMainWindowViewModelが同じクラスであるようです。 – Sjips

+0

xamlの 'Popup'部分が見えますか? – Sinatr

+6

これはMVVMではありません。ビューモデルでUI要素プロパティを割り当てることは意味がありません。つまり、listBoxPopupContentのItemsSourceを設定したりバインドしたりしていないようです。 – Clemens

答えて

1

ページのDataContext tはVMのアクティブなインスタンスに設定されています。

第2に、VMはClassViewMethodに格納された項目に変更された項目があることを通知するためにINotifyPropertyChangedを実装する必要があります。

ターゲットをObservableCollectionにすることは、そのダイナミックに影響しません。したがって、ページがコレクションを表示するときに、notifyイベントへの呼び出しが通知され、コントロールがデータをロードします。あなたの例では通知イベントが表示されないため、2つの障害ポイントのうちの1つが表示されます。


私はこのコードについて少し困惑している私のブログの記事Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding

+0

答えをありがとう。私はnotifyプロパティを実装し、DataContextはすでに設定されています。まだ動作していません..リストがいっぱいであり、それはすべてです。私は私の質問を編集した、多分あなたは考えがある。ありがとうございます。 – Nica

+0

@Nica 'NotifyPropertyChanged(" ClassViewMethod ")'はどこで完了しましたか?あなたの例では、それは決して完了しませんし、そのイベントがなければ、コンボボックスはリフレクションによってデータをロードしません。 – OmegaMan

関連する問題