ListView 不显示 BindingCollection 的内容
ListView not showing contents of BindingCollection
我已经查看了大约一百种不同的堆栈溢出 questions/answers,我的代码看起来 完全 与大多数答案相同,但我仍然不能让 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;
}
我有其他属性显示在 MainViewModel
的 xaml 中,很好。如果我在 InitializeComponent
上放置一个断点,我可以看到 MainViewModel.Profiles
包含我希望它包含的内容。
然而,我得到的只是名称 header,没有内容。
我在这里错过了什么?
编辑:
如果我将 OnPropertyChanged
添加到配置文件的 setter 并相应地调整我的视图模型:
...
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 自行加载,然后您决定在 page/window 加载后要做什么或显示什么。
这里是修改后的代码,
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);
}
}
我已经查看了大约一百种不同的堆栈溢出 questions/answers,我的代码看起来 完全 与大多数答案相同,但我仍然不能让 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;
}
我有其他属性显示在 MainViewModel
的 xaml 中,很好。如果我在 InitializeComponent
上放置一个断点,我可以看到 MainViewModel.Profiles
包含我希望它包含的内容。
然而,我得到的只是名称 header,没有内容。
我在这里错过了什么?
编辑:
如果我将 OnPropertyChanged
添加到配置文件的 setter 并相应地调整我的视图模型:
...
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 自行加载,然后您决定在 page/window 加载后要做什么或显示什么。
这里是修改后的代码,
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);
}
}