我有两个窗口:父母和孩子。父窗口中有列表框。
的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");
}
}
}
答案 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(..)
方法中,不会更新用户界面,因为不会触发更改通知。