【问题标题】:C# wpf listbox not updating from ObservableCollectionC# wpf 列表框未从 ObservableCollection 更新
【发布时间】:2015-04-08 08:54:03
【问题描述】:

我正在尝试获取使用 ListBox 所需的数据绑定。 我已将文本文件中的一些数据解析为ObservableCollection<ViewModel>,但列表框中的数据没有更新。

这里有一些信息:

解析器写入的数据:

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);
}

我使用这些 XAML 选项在我的 WPF 应用程序中创建了一个 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 模式和数据绑定,但我不知道我做错了什么。

提前致谢!

【问题讨论】:

    标签: c# wpf xaml mvvm listbox


    【解决方案1】:

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

    您将不得不设置 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}" .../>
    

    【讨论】:

    • 谢谢!那确实解决了问题!所以,作为后续。我在做这种 MVVM 的事情是否正确? (从你在问题中看到的内容来看)
    • 如果您将 MainData 作为 MainViewModel 中的属性,如答案中所建议的那样,我会说是的。
    • 好的!很高兴知道。再次感谢
    猜你喜欢
    • 2014-01-15
    • 2011-11-24
    • 2014-04-06
    • 1970-01-01
    • 2010-11-29
    • 2018-07-08
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多