假设我正在从数据服务中读取一些书本对象,并使用每个结果创建一个ViewModel以便显示在ListBox或DataGrid中。
public class BookViewModel {
public BookViewModel(DataService.BookResult B) {
this.CurrentBook = B;
//other details elided
}
如果此ViewModel具有许多与数据服务中的book对象相同的确切属性,是否有充分的理由将所有必需的属性从DataService.BookResult复制到ViewModel,还是可以只存储Dataservice .BookResult对象,并通过它进行绑定(bind):
<sdk:DataGridTemplateColumn SortMemberPath="CurrentBook.Title" Header="Title" Width="430">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock VerticalAlignment="Center" Margin="5,0,0,0" Text="{Binding CurrentBook.Title}" ToolTipService.ToolTip="{Binding CurrentBook.Title}"></TextBlock>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="Publisher" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid VerticalAlignment="Center" Margin="7,0,0,0">
<TextBlock x:Name="publisherText" Visibility="{Binding CurrentBook.Publisher, Converter={StaticResource hasValueConverter}}" Text="{Binding CurrentBook.Publisher}" ToolTipService.ToolTip="{Binding CurrentBook.Publisher}" />
<TextBlock Visibility="{Binding Visibility, ElementName=publisherText, Converter={StaticResource visibilityInverter}}" Style="{StaticResource textForNoData}">No Publisher Info</TextBlock>
</Grid>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
我知道这违反了Demeter的定律,我应该只列出所有属性,并让ValueInjecter在工厂方法中进行属性映射细节,但是由于这是一个很小的项目,因此需要对数据服务进行更改发生这种变化的可能性非常小,并且这种变化所占的空间相对较小,是否有任何Silverlight/WPF特定的原因说明这可能不是好主意?
最佳答案
得墨meter耳定律限制了方法的使用,而不是属性。对对象模型中属性的只读访问不会违反它。
只要您只进行单向绑定(bind)并且不需要属性更改通知,我就完全不用担心这一点。但是在您的 View 中查找有关数据元素的描述性信息?我认为没有问题。
关于wpf - Silverlight/WPF Viewmodel最佳做法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5679241/