c# - ListView 不显示 BindingCollection 的内容
问题描述
我已经查看了可能有一百个不同的堆栈溢出问题/答案,我的代码似乎与大多数答案完全相同,但我仍然无法让 ListView 显示任何内容。
在我的MainWindow.cs
我有
api = new Api();
MainViewModel = new MainViewModel();
MainViewModel.Loading = true;
DataContext = MainViewModel;
AttemptLogin();
if (Account.IsLoggedIn){
api.getAccountDetails();
MainViewModel.GetProfiles(api);
InitializeComponent();
}
我的MainViewModel
包含:
private ObservableCollection<Profile> _profiles;
public ObservableCollection<Profile> Profiles => _profiles;
...
public void GetProfiles(Api api){
_profiles = new ObservableCollection<Profile>(api.getProfiles());
}
在我的 xaml 中,我有:
<Window.DataContext>
<viewModels:MainViewModel />
</Window.DataContext>
<ListView
ItemsSource="{Binding Profiles}">
<ListView.View>
<GridView>
<GridViewColumn
DisplayMemberBinding="{Binding Name}"
Header="Name" />
</GridView>
</ListView.View>
</ListView>
API调用是:
public ObservableCollection<Profile> getProfiles(){
var request = new RestRequest("api/benchmarks/results", Method.POST);
var response = _restClient.Execute(request);
dynamic test = JObject.Parse(response.Content);
ObservableCollection<Profile> Profiles = new ObservableCollection<Profile>();
for (var i = 0; i < test.result.Count; i++){
Profiles.Add(new Profile(test.result[i]));
}
return Profiles;
}
我有其他属性可以很好地显示在 xaml 中MainViewModel
。如果我在 上放置一个断点InitializeComponent
,我可以看到MainViewModel.Profiles
包含我希望它包含的内容。
然而,我得到的只是名称标题,没有内容。
我在这里想念什么?
编辑:
如果我添加OnPropertyChanged
到 Profile 的设置器并相应地调整我的视图模型:
...
public ObservableCollection<Profile> Profiles{
get => _profiles;
set{
_profiles = value;
OnPropertyChanged("Profiles");
}
}
...
public void GetProfiles(Api api){
Profiles = new ObservableCollection<Profile>(api.getProfiles());
}
没有变化。
解决方案
尝试在 InitializeComponent() 方法之后设置 DataContext。还有一个建议,将 InitializeComponent() 移出 if 块。始终远离条件块,让 UI 自行加载,您可以在加载页面/窗口后决定要做什么或显示什么。
这是修改后的代码,
public MainWindow()
{
InitializeComponent(); // Keep this as first statement in your View constructor
// Move below code to some private method and make a call from here.
// Just code looks simpler and clean.
InitializeViewModel();
}
private void InitializeViewModel()
{
api = new Api();
MainViewModel = new MainViewModel();
MainViewModel.Loading = true;
DataContext = MainViewModel;
AttemptLogin();
if (Account.IsLoggedIn)
{
api.getAccountDetails();
MainViewModel.GetProfiles(api);
}
}
推荐阅读
- salesforce - 在电子邮件模板中写入选项列表键而不是显示值
- python - 'django' 在 PyCharm 的虚拟环境中未被识别为内部或外部命令
- here-api - 我们如何在单个 App ID 中跟踪客户交易使用情况?
- python - 如何在测试其他所有内容之前运行配置检查测试?
- javascript - 如何在 Google Sheets API node.js batchUpdate 请求上指定准确的工作表
- android - Kotlin 中的 withContext(Dispatchers.IO) 和 with(Dispatchers.IO) 有什么区别?
- c# - 为什么上传较大文件时出现 CORS 错误?
- visual-studio-code - VSCode - 如何将文件视图拆分到单独的窗口?
- linux - 使用 Linux 原始套接字捕获 PTP 数据包
- javascript - 如何使用传统处理从 jquery ajax 发送的数组:false