1

早些时候,当我想编辑 DataGrid 中的一行时,我只是将光标设置在 DataGtid 的行上,并以代码隐藏形式 (xxx.xaml.cs) 的方法编写了这样的代码:

int k = XXXDataGrid.SelectedIndex;

然后我可以从 DataGrid 的一行中检索数据。现在我尝试使用 WPF 的 MVVM 模式,并且我已经读到我所有的 CRUD 操作都应该用模型编写。好的。我尝试采用“DataGrid.SelectedIndex”,但如果不在代码隐藏文件中创建处理程序就不可能。

我想知道如何从位于 MVVM 的“模型”中的其他类中获取“DataGrid.SelectedIndex”和 DataGrid 行的数据。

值类型何时存储在堆栈中?我读过很多 C# 书籍,当我读到值和引用类型时,我总会想到一个问题:值类型什么时候存储在堆栈中?原因程序员无法从类中初始化任何值类型。

4

1 回答 1

1

您的 ViewModel 将具有填充模型对象的属性。在这里您将分配它们,以便视图能够显示数据。

    public ParentModel 
    {
        get { return parentModel; }
        private set
        {
            if (parentModel != value)
            {
                parentModel = value;
                RaisePropertyChanged("ParentModel");
            }
        }
    }


    public int SelectedItemIndex
    {
        get { return selectedItemIndex; }
        set
        {
            if (selectedItemIndex != value)
            {
                selectedItemIndex = value;
                RaisePropertyChanged("SelectedItemIndex");
            }
        }
    }

View 将包含显示数据的对象,可以是 DataGrid、ComboBox 等。您可以使用 ItemTemplates 自定义数据的显示方式,但关键是bind您的数据到控件。这可以允许数据以仅 ViewModel 到 View (OneWay) 或 View 到 ViewModel (OneWayToSource) 或两者 (TwoWay) 的方向模式流动。因此,当用户更改所选索引时,数据将流回 ViewModel,因为它在下面为 TwoWay 设置。这里的 ItemsSource 设置为 OneWay,因此只有 ViewModel 可以为 View 更改它。

    <DataGrid ItemsSource="{Binding Path=ParentModel.Items, Mode=OneWay}"
              SelectedIndex="{Binding Path=SelectedItemIndex, Mode=TwoWay}" />

如果 ViewModel 需要与 BusinessLogic 交互,只需传递 Data。如果单独的 ViewModel 需要这些信息,您将需要使用框架中可用的概念,例如。EventAggregator(Prism),用于传递数据,因为它们彼此不了解。


MVVM 的核心概念是模型和 WPF 控件的属性的绑定,就像这样。我认为您需要阅读更多内容以充分利用其功能和设计。一些非常有用的问题/答案可以在 StackOverflow 上找到,MSDN 有几个很好的教程等。

于 2013-08-22T12:24:25.713 回答