首页 > 解决方案 > 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());
}

没有变化。

标签: c#wpfobservablecollection

解决方案


尝试在 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);
  }
}

推荐阅读