将ObservableCollection绑定到ItemsControls或ListView不起作用

时间:2016-12-07 15:11:20

标签: uwp uwp-xaml

在UWP项目中,我有:1页,1个usercontrol和1个viewmodel。

该页面包含一个SplitView,用户控件加载在窗格中:

<SplitView.Pane>
    <local:MyUserControl />
</SplitView.Pane>

页面和用户控件都具有相同的datacontext:视图模型(称为MyPageViewModel)。 ViewModel有一个ObservableCollection对象,如:

public ObservableCollection<MyModel> Commands { get; set; }

在按钮点击事件的代码隐藏页面中,我创建了一个List:

List<MyModel> ListCommands;

在我加载一些数据的地方,然后我直接从ViewModel调用一个方法,如:

(this.DataContext as MyPageViewModel).Load(listCommands);

Load是View Model中定义的一个方法,它填充了ObservableCollection:

public void Load(List<MyModel> commands)
    {
        Commands = new ObservableCollection<MyModel>(commands);
    }

此ObservableCollection在运行时成功加载,但用户控件中的ItemsControl不显示用户控件代码中的数据(就好像用户界面未发生通知更改):

<UserControl.DataContext>
    <ViewModels:RestaurantDetailsViewModel />
</UserControl.DataContext>

...

<ItemsControl ItemsSource="{Binding Commands}"
                  Grid.Row="1" />

ItemsControl保持为空(我使用DataTemplate显示内部MyModel属性)。我也用ListView测试过,但结果是一样的。

注意:我的viewmodel继承自实现INotifyPropertyChanged的自定义类:

public class MyPageViewModel : BindabelBase

public abstract class BindableBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public void Set<T>(ref T storage, T value, [CallerMemberName()]string propertyName = null)
    {
        if (!object.Equals(storage, value))
        {
            storage = value;
            this.RaisePropertyChanged(propertyName);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

感谢所有快速解答,问题解决了。

我的错误是重新声明了DataContext的页面和用户控件,创建了ViewModel的新实例(=数据上下文对于页面和用户控件不同,两个différents实例)。

解决方案是向用户控件指示页面的datacontext,如下所示:

<local:MyUserControl DataContext="{Binding DataContext, ElementName=CommandesPage}" />

其中CommandesPage是页面的名称。