避免子类mvvm中的数据重复

时间:2014-02-23 23:07:50

标签: c# mvvm windows-phone-8

我正在开发一个Windows手机应用程序,我正在使用MVVM模式。简而言之,我有一个绑定到课堂的列表。该类包含一个可观察的集合,用于存储每个行的信息。

当只需要在父类中设置特定数据的一个实例时,是否有办法避免在子类中复制数据。考虑以下情况:

格    - TableName    - 行

如上所述,rows属性是一个Observable Collection,即ObservableCollection,其中行是由许多属性组成的类,如Id,Code,Name等......

这个可观察的集合绑定到一个列表,每一行的viewmodel都有一个绑定到ICommand的动作,这样当它被点击时,它会触发一个事件,我将能够重定向到另一个页面,但我会能够使用行的信息,即Id,Code等...

问题在于我需要访问TableName,虽然我可以将其作为行的类属性之一包含在内,但它似乎毫无意义,因为这将是一遍又一遍的相同值。

设计这个的正确方法是什么?是否存在适用于此场景的特定模式,或者只是复制每个行中的数据的情况......它感觉不对!

感谢。

吨。

1 个答案:

答案 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}" />