组合框列表未在MVVM中填充

时间:2017-10-27 12:13:51

标签: c# wpf mvvm listbox

我在MVVM WPF中工作。我在弹出式面板中包含了一个listBox。弹出窗口显示,但是listBox没有填充,没有想法的原因。列表框用于过滤一列数据。这是listBox:

<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 个答案:

答案 0 :(得分:1)

您需要验证页面的DataContext是否已设置为VM的活动实例。

其次,VM需要实现INotifyPropertyChanged以表示存储在ClassViewMethod的项目已更改项目。

使目标成为ObservableCollection不会影响该动态。因此,当页面应该查看集合时,将发出对通知事件的调用的信号,并且控件将加载数据。我没有在你的例子中看到通知事件,因此有两个可能的失败点。

我在博文Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding

上展示了所有这些内容