我正在开发一个Windows手机应用程序,我正在使用MVVM模式。简而言之,我有一个绑定到课堂的列表。该类包含一个可观察的集合,用于存储每个行的信息。
当只需要在父类中设置特定数据的一个实例时,是否有办法避免在子类中复制数据。考虑以下情况:
格 - TableName - 行
如上所述,rows属性是一个Observable Collection,即ObservableCollection,其中行是由许多属性组成的类,如Id,Code,Name等......
这个可观察的集合绑定到一个列表,每一行的viewmodel都有一个绑定到ICommand的动作,这样当它被点击时,它会触发一个事件,我将能够重定向到另一个页面,但我会能够使用行的信息,即Id,Code等...
问题在于我需要访问TableName,虽然我可以将其作为行的类属性之一包含在内,但它似乎毫无意义,因为这将是一遍又一遍的相同值。
设计这个的正确方法是什么?是否存在适用于此场景的特定模式,或者只是复制每个行中的数据的情况......它感觉不对!
感谢。
吨。
答案 0 :(得分:1)
为什么不在ICommand
中创建TableNameVM
,并将其传递给每个子RowVM
以作为简单属性公开。如果TableNameVM
内的命令的实现需要Row,那么只需将其作为命令参数传递。
您甚至可以放弃添加RowVM
,只需在行绑定上使用RelativeSource
来绑定到TableName。但是,我必须承认我不喜欢这种短期切割。
这样的事情:
public class TableNameVM : ViewModelBase
{
private readonly ICommand myCommand;
public ObservableCollection<RowVM> Rows { get; set; }
public TableNameVM()
{
this.myCommand = new DelegateCommand<RowVM>(ExecuteMyCommand);
//create 10 rows
for(int n = 1; n < 10; n++)
this.Rows.Add(new RowVM(this.myCommand));
}
private void ExecuteMyCommand(RowVM row)
{
//do whatever
}
}
public class RowVM : ViewModelBase
{
public ICommand MyCommand { get; private set; }
public RowVM(ICommand myCommand)
{
this.MyCommand = myCommand;
}
}
用于触发命令的“行”按钮看起来像:
<Button Command="{Binding MyCommand}" CommandParam="{Binding}" />