如何在多个ViewModel中绑定公共属性?

时间:2017-06-30 12:56:56

标签: c# wpf xaml mvvm

我遇到了绑定应在多个ViewModel中使用的公共属性的问题。

在我的第一个MainViewModel中,我正在连接到返回人员列表的数据库。

private async void Connected()
{
    try
    {
        base.Peoples = await DatabaseConnection.GetAllPersonsCommandAsync();
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

在第二个视图中我希望通过将这些数据绑定到Peoples来显示这些数据:

<ListView Width="200" 
   Margin="0 20 0 0" 
   HorizontalAlignment="Left" 
   ItemsSource="{Binding Peoples}"
   cm:Message.Attach="[Event SelectionChanged] = [Action Peoples_SelectionChanged($source)];">

我将Peoples绑定到ViewModelBase

private List<Person> _peoples;
public List<Person> Peoples
{
    get => _peoples;
    set => OnPropertyChanged(ref _peoples, value);
}

我想在ViewModelBase继承的其他ViewModel中使用此Peoples列表(如MainViewModel)。

我希望这个问题对你来说是可以理解的。

问候

==== 更新

这是我的OnPropertyChanged方法:

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged<T>(ref T property, T value, [CallerMemberName]string propertyName = "")
    {
        property = value;
        PropertyChanged?.Invoke(this,  new PropertyChangedEventArgs(propertyName));
    }

===== 第二次更新

我测试了一些东西,当我创建这样的新人时:

private ObservableCollection<Person> _peoples = new ObservableCollection<Person>{
    new Person("aa", "aa", 1, 1)
};
public ObservableCollection<Person> Peoples
{
    get => _peoples;
    set => OnPropertyChanged(ref _peoples, value);
}

我可以看到他们。任何淤泥?

1 个答案:

答案 0 :(得分:1)

请使用ObservableCollection<Person>填充更改。也不要重新初始化它 - 而是使用Clear()Add()。您现在还可以使用CollectionChanged事件。

如果这不起作用 - 请尝试检查您的DataContext是否正确。

请这样:

    public ObservableCollection<Person> Peoples
    {
        get;
    }

    public MyConstructor()
    {
        Peoples = new ObservableCollection<Person>();
    }

    public void RefreshPeopleCollection(IEnumerable<Person> persons)
    {
        Peoples.Clear();

        foreach(var person in persons)
        {
            Peoples.Add(person);
        }
    }