C#wpf列表框未从ObservableCollection更新

时间:2015-04-08 08:54:03

标签: c# wpf xaml mvvm listbox

我试图获取数据绑定,我需要使用ListBox。 我已将一些数据从文本文件解析为ObservableCollection<ViewModel>,但数据未在ListBox中更新。

以下是一些信息:

从解析器写入的数据:

class MainData
{
    private static ObservableCollection<GroupViewModel> groupModelList = new ObservableCollection<GroupViewModel>();
    public static ObservableCollection<GroupViewModel> GroupModelList
    {
        get { return groupModelList; }
    }
}

GroupViewModel拥有什么(不是除了它以外的所有内容):

class GroupViewModel : INotifyPropertyChanged
{
    private GroupModel groupModel;

    public event PropertyChangedEventHandler PropertyChanged;

    public GroupViewModel()
    {
        groupModel = new GroupModel();
    }

    public string Name
    {
        get { return groupModel.name; }
        set
        {
            if (groupModel.name != value)
            {
                groupModel.name = value;
                InvokePropertyChanged("Name");
            }
        }
    }

    ...
}

GroupModel持有什么:

class GroupModel
{
    public string name { get; set; }
}

解析器将新项目添加到GroupModelView

if (split[0] == "group")
{
    currentGroup = new GroupViewModel();
    currentGroup.Name = split[1];

    MainData.GroupModelList.Add(currentGroup);
}

我在WPF应用程序中使用以下XAML选项创建了一个ListBox:

<Window x:Class="SoundManager.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:SoundManager.ViewModels"
    xmlns:vm2="clr-namespace:SoundManager.Code"
    Title="MainWindow" Height="720" Width="1280">
<Window.Resources>
    <vm:MainViewModel x:Key="MainViewModel" />
    <vm2:MainData x:Key="MainData" />
</Window.Resources>

<ListBox Grid.Row="2" Height="484" HorizontalAlignment="Left" Margin="12,0,0,0" Name="lbFoundItems" VerticalAlignment="Top" Width="201" ItemsSource="{Binding Source={StaticResource MainData}, Path=GroupModelList/Name}" />

但由于某些原因,数据未在UI中更新(新项目未在UI中明显添加)。
我刚刚开始使用MVVM模式和数据绑定,但我无法弄清楚我做错了什么。

提前致谢!

1 个答案:

答案 0 :(得分:4)

GroupModelList/Name不是此处的有效属性路径。像这样设置不会使ListBox显示Name集合中数据项的GroupModelList属性。

您必须设置ListBox的DisplayMemberPath属性:

<ListBox ItemsSource="{Binding Source={StaticResource MainData}, Path=GroupModelList}"
         DisplayMemberPath="Name"/>

或设置ItemTemplate属性:

<ListBox ItemsSource="{Binding Source={StaticResource MainData}, Path=GroupModelList}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

此外,GroupModelList属性不应该是静态的:

class MainData
{
    private ObservableCollection<GroupViewModel> groupModelList =
        new ObservableCollection<GroupViewModel>();

    public ObservableCollection<GroupViewModel> GroupModelList
    {
        get { return groupModelList; }
    }
}

然后您可能在视图模型中将MainData作为属性,并像这样绑定ListBox:

<ListBox ItemsSource="{Binding Source={StaticResource MainViewModel},
                               Path=MainData.GroupModelList}" .../>