2016-11-08 71 views
1

我试图显示XAML中的项目列表。我从公共API获取列表,将其转换为我需要的类,然后我想显示它。ObservableCollection不显示在UI中

public static async Task PopulateListAsync(ObservableCollection<MyClass> myList) { 
    var listContainer = await GetListAsync(); 

    foreach (var item in listContainer) { 
     //converting from one class to another, editing some properties and such 
     myList.Add(item); 
    } 
} 

,并在MainPage.cs我

public ObservableCollection<MyClass> Value { get; set; } 

public MainPage() { 
    this.InitializeComponent(); 
    Value = new ObservableCollection<MyClass>(); 
} 

private async void Page_Loaded(object sender, RoutedEventArgs e) { 
    await PopulateListAsync(Value); 
} 

我显示在XAML罚款。

但后来我想介绍的过滤。所以我得到的数据,将它们转换为一些类并将它们插入到列表中,然后使用LINQ进行过滤(在ObservableCollection中进行过滤似乎更容易)。

基本上我与FormatListAsync()其中,而不是直接插入数据到ObservableCollection<>,返回一个List<>取代PopulateListAsync()。然后,我有一个“中间人”功能

public static async Task PopulateListAsync(ObservableCollection<MyClass> myList) { 
    myList = new ObservableCollection<MyClass>(await FormatListAsync()); 
    //filtering itself isn't implemented yet, but it would be placed here 
} 

我可能只是环槽mylist并添加一个接一个进入ObservableCollection<>,但我觉得肯定有一个更好的方法。

我想我应该实现一些PropertyChanged事件或类似的东西,但我尝试了几个(例如this one),但未成功。我不认为我很理解如何实施它。

+0

我不认为你可以做Value = new ObservableCollection ();因为Value属性是字符串类型。一个错字可能? –

+0

只是一个错字。抱歉。 – rancor1223

+0

你是缺少onPropertyChange为observablecollection – Master

回答

1

如果您分配的方法参数新值,那么你只需要改变引用的副本收集和不改变源引用。你可以阅读更多关于passing reference types as method parameters on MSDN

另外,如果你将改变,不是实现INotifyPropertyChanged本身那么你就必须在UI没有变化,因为你的观点不知道的变化特性。

在你可以操纵源集合,而不是创造新的简单易行的方式。只是这样做

public static async Task PopulateListAsync(ObservableCollection<MyClass> myList) 
{ 
    // newList can be an List<MyClass> type, not ObservableCollection 
    var newList = await FormatListAsync(); 

    // change displayed list with new data 
    myList.Clear(); 
    foreach(var newValue in newList) 
     myList.Add(newValue); 
} 

另一种选择,可以实现INotifyPropertyChanged您的视图模型和Value setter方法提高PropertyChanged事件:

private ObservableCollection<MyClass> _value; 
public ObservableCollection<MyClass> Value 
{ 
    get 
    { 
     return _value; 
    } 
    set 
    { 
     // I hope this line of code will convince you to give more clear variable name 
     if(value != _value) 
     { 
      _value = value; 
      NotifyPropertyChanged(nameof(Value)); 
     } 
    } 
} 

此外,你需要直接分配ValuePopulateListAsync()

public static async Task PopulateListAsync() 
{ 
    Value = new ObservableCollection<MyClass>(await FormatListAsync()); 
} 
+0

我虽然是第一种做事的方式。我想知道是否有更好的方法。关于'NotifyPropertyChanged' - 我可以在不使用MVVM模式的情况下实现它吗?这是我在C#中的第一个合适的项目,我真的放弃了MVVM,因为我无法实现它。 – rancor1223

+0

@ rancor1223好,MVVM是更好的办法:)另外,你并不需要,如果你正在改变整个列表,那么你的财产可能有型'名单'使用'ObservableCollection'。如果要动态操作集合(使用清除,添加和其他方法),请使用ObservableCollection。 好的,你可以为你的对象实现INPC,它不是分离的类,而是你的视图的数据源。 此外,直接操纵控件及其属性的方法非常糟糕: 'ObservableCollection data = new ObservableCollection (...); ListBox.ItemsSource = data;' –

+0

下次我会给MVVM一个镜头。这对我来说太多了:)。我将会看到仅仅使用一个'List <>',但是我认为'ObservableCollection <>'给了我一些空间,以便在需要的时候使用它。非常感谢您的帮助! – rancor1223