假设我正在从数据服务中读取一些书本对象,并使用每个结果创建一个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/

10-15 03:13