C# wpf 列表框不从 ObservableCollection 更新
C# wpf listbox not updating from ObservableCollection
我正在尝试获取使用 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);
}
我在 WPF 应用程序中使用这些 XAML 选项创建了一个列表框:
<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 模式和数据绑定,我不知道自己做错了什么。
提前致谢!
GroupModelList/Name
不是有效的 属性 路径。像这样设置不会使 ListBox 显示 GroupModelList
集合中数据项的 Name
属性。
您必须改为设置列表框的 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}" .../>
我正在尝试获取使用 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);
}
我在 WPF 应用程序中使用这些 XAML 选项创建了一个列表框:
<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 模式和数据绑定,我不知道自己做错了什么。
提前致谢!
GroupModelList/Name
不是有效的 属性 路径。像这样设置不会使 ListBox 显示 GroupModelList
集合中数据项的 Name
属性。
您必须改为设置列表框的 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}" .../>