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