在我的 MVVM Light 应用程序中,我在客户列表中进行搜索。搜索缩小了显示在主/详细视图中的客户列表,其中包含一个数据网格(主 CustomerSearchResultView)和一个单独定义的带有名字、姓氏、地址等的用户控件(详细信息 - CustomerSearchDetailView)。以下是主/详细视图的主要内容:
<StackPanel MinWidth="150" >
<TextBlock Text="Customer Search Result List" />
<Grid>
<DataGrid Name="CustomerList" ItemsSource="{Binding SearchResult}" SelectedItem="{Binding SelectedRow, Mode=TwoWay}" >
.....
</DataGrid>
</Grid>
<Grid Grid.Column="2">
<TextBlock Text="Customer Details" Style="{StaticResource Heading2}" Margin="30,-23,0,0"/>
<content:CustomerSearchDetail DataContext="{Binding SelectedRow}" />
</Grid>
</Grid>
</StackPanel>
两者都有对应的 ViewModel。请备注 CustomerSearchDetail 的 DC,SelectedRow - 它是 CustomerSearchResultViewModel 上的一个属性,定义如下:
private Customer _selectedRow;
...
public Customer SelectedRow
{
get { return _selectedRow; }
set
{
_selectedRow = value;
RaisePropertyChanged("SelectedRow");
}
}
...
因此,我没有在 CustomerSearchDetailView 上定义任何 DC - 它是在“主”视图的绑定中设置的(如上所示),它似乎工作正常。
在我的模型文件夹中,我创建了此处使用的客户类。它实现 ObservableObject 和 IDataErrorInfo 并具有引发propertychanged 事件的公共属性。
我运行应用程序,一切似乎都很好。注意:CustomerSearchDetailView 的 ViewModel(即 CustomerSearchDetailViewModel.cs)在这个阶段只是一个空壳并且没有被使用(据我所见......构造函数永远不会被访问)
现在我想在详细视图中为我的客户添加保存/更新功能。好的,我向 CustomerSearchDetailView 添加了一个保存按钮,如下所示:
<Button Content="Save" Command="{Binding Path = SaveCommand}" Width="80" Margin="0,0,15,0"/>
我在 CustomerSearchDetailViewModel 中创建了我的“SaveCommand”RelayCommand 属性 - 但它从未被访问过。
嗯……经过一番谷歌搜索后,我想出了这个:
<Button Content="Save" Command="{Binding Source={StaticResource MyCustDetails}, Path = SaveCommand}" Width="80" Margin="0,0,15,0"/>
我在此视图中将“MyCustDetails”定义为指向 CustomerSearchDetailViewModel 的资源。瞧!我现在在调试时点击了该方法……但是,我的客户当然是“空的”。(事实上,我在这里花了 2 个小时实现 CommandParameter 并将其绑定到主视图上的“SelectedRow”属性 - 但客户仍然是“null”)。
更多地搜索和搜索 mvvm 示例,我在 Customer 类(模型对象)上实现了我的“SaveCommand”。你猜怎么着?编辑后的客户通过了 - 我可以将其发送到我的 EF 层,一切似乎都很好......
而且 - 如果你还在我身边 - 我的问题来了:
1.) 我想——并且认为这是做事的“正确的 MVVM 方式”——让我的 CRUD/Repository 在 ViewModel 中访问。我怎么能在我的场景中做到这一点?
2.)现在我通过模型类(客户)设置了我的 CRUD - 我应该为问题 1 烦恼吗?事实上,我已经删除了 CustomerSearchDetailViewModel 并且一切运行正常。我觉得我发明了 View - Model (MV) 框架...... :-P
我非常希望得到对此的反馈——我为这个“文字墙”道歉。