在MVVM中使用ICommand更改数据

时间:2013-05-22 06:05:02

标签: wpf mvvm icommand

我有两个窗口:父母和孩子。父窗口中有列表框。

的MainView:

<Button x:Name="btnUpdate" Content="Update"
                Command="{Binding Path=MyCommand}" CommandParameter="{Binding ElementName=lstPerson, Path=SelectedItem}" />

<ListBox x:Name="lstPerson" ItemsSource="{Binding Persons}" />

我正在尝试使用带参数的ICommand来更改所选的Person双向更新。

PersonViewModel:

        private ICommand myCommand;
        public ICommand MyCommand
        {
            get
            {
                if (myCommand == null)
                {
                    myCommand = new RelayCommand<object>(CommandExecute, CanCommandExecute);
                }

                return myCommand;

            }

        }

        private void CommandExecute(object parameter)
        {

            var ew = new EditWindow()
                         {
                             DataContext =
                                 new EditViewModel()
                                     {
                                         Name = ((Person) parameter).Name, 
                                         Address = ((Person) parameter).Address
                                     }
                         };

            ew.Show();

        }

但所选的Person实例在列表框中没有更改。我需要写什么来写xaml或PersonViewModel才能使它工作?

P.S。

这是我的人

    public class Person : INotifyPropertyChanged
    {
        private string name;
        private string address;

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

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }
        public string Address
        {
            get
            {
                return address;
            }
            set
            {
                address = value;
                OnPropertyChanged("Address");
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

命令的exceution命令参数错误。当您绑定到绑定到SelectedItem的列表的ObservableCollection<PersonViewModel>时,所选项目将为PersonViewModel类型。尝试相应地初始化ICommand as RelayCommand and modify CommandExecute(PersonViewModel person)。

其次,ICommand是在PersonViewModel上定义的,但Command应位于包含Persons集合的ViewModel上。因此,无论是移动Command还是在PersonViewModel上以修改特定ViewModel的方式定义命令,它都会打开。比你可以省略CommandParameter,但绑定命令如下:

并使CommandExecute像这样:

private void CommandExecute(object parameter)
{
    // Modify this, ie. this.Name = something
}

最后,您的ViewModel也需要实现INotifyPropertyChanged并转发模型更改通知。否则,将不会反映更改,除非绑定到实际属性更新它。例如,如果你像这样绑定

<TextBox Text="{Binding Name, Mode=TwoWay}" />

ViewModel上的Name属性将会更新,但如果您调用

Name = "ChuckNorris"

在您的CommandExecute(..)方法中,不会更新用户界面,因为不会触发更改通知。