无法通过派生类使用ObservableCollection方法更新ListView

时间:2018-06-14 10:36:43

标签: c# wpf xaml

有两个视图,第一个视图包含一个ListView以及2个用于添加和删除人的按钮。视图2通过使用ContentControl显示所选视图,单击“添加”按钮时,它会显示一个名称,性别,...的表单,以及用于存储信息并在ListView中显示人员姓名的按钮。 当我尝试从ListView中删除一个人时,它工作,因为该按钮位于ListView的相同视图/上下文中。但是当我通过AddViewModel调用Add方法时,它不会更新UI。 下面是可用的不同类的相关部件代码。

View sample

View1.xaml

<Window.Resources>
    <vm:ViewModelBase x:Key="ViewModel"/>
    <DataTemplate x:Name="addViewTemplate" DataType="{x:Type vm:AddViewModel}">
        <views:AddView/>
    </DataTemplate>
</Window.Resources>

    <Button Command="{Binding change2addViewCommand,
                            Source={StaticResource ViewModel}}">
                    <materialDesign:PackIcon Kind="Plus" Width="12"/>
     </Button>
     <Button Command="{Binding removeFromListCommand, Source={StaticResource ViewModel}}"
                        CommandParameter="{Binding ElementName=lvNames, Path=SelectedItem}">
                    <materialDesign:PackIcon Kind="Delete" Width="12"/>
                </Button>
      <ListView MinHeight="560"
                          DataContext="{Binding Source={StaticResource ViewModel}}"
                          ItemsSource="{Binding}"  
                          x:Name="lvNames" >
      </ListView>
      <ContentControl x:Name="controllerViews" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="4"
                    Grid.RowSpan="5" Content="{Binding CurrentView, Mode=TwoWay}"/>

ViewModelBase.cs

public class ViewModelBase: ObservableCollection<Person>, INotifyPropertyChanged
{
    private ViewModelBase currentView;
    public ViewModelBase CurrentView
    {
        get
        {
            return currentView;
        }
        set
        {
            currentView = value;
            OnPropertyChanged("CurrentView");
        }
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    public ViewModelBase()
    {

        for (int i = 1; i <= 2; i++)
        {
            Add(new Person()
            {
                Name = "Person" + i,
                Age = i,
                Gender = Gender.Female,
                Comments = "",
                Photo_Path = ""
            });
        }
        change2addViewCommand = new RelayCommand(ExecuteAddCommand, CanExectuteAddCommand);
        removeFromListCommand = new RelayCommand(ExecuteRemoveCommand, CanExectuteRemoveCommand);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public bool CanExectuteAddCommand(object param)
    {
        return true;
    }

    public void ExecuteAddCommand(object param)
    {
        CurrentView = new AddViewModel();
    }

    public bool CanExectuteRemoveCommand(object param)
    {
        return true;
    }

    public void ExecuteRemoveCommand(object param)
    {
        Person player = param as Person;
        Remove(player); //Working

    }

    protected void AddToListView(Person player)
    {
         Add(player) // Not Working

    }

}

}

AddViewModel.cs

public class AddViewModel: ViewModelBase
{
    public RelayCommand addViewCheckCommand { get; set; }
    public AddViewModel()
    {
        addViewCheckCommand = new RelayCommand(ExecuteCheckCommand, CanExecuteCheckCommand);
    }

    private bool CanExecuteCheckCommand(object param)
    {
        return true;
    }

    private void ExecuteCheckCommand(object param)
    {
        BocciaPlayer player = param as Person;
        AddToListView(player); // Inherited method
    }
}

0 个答案:

没有答案