我一直在使用Silverlight中的MVVM模式,并且想知道如果ViewModel构造函数具有参数(如果是接口类型),如何实现从View到ViewModel的绑定。
如果我将viewmodel绑定到XAML中的视图,那么就不能使用参数化构造函数。鉴于我正在创建一个默认构造函数,将实例传递给参数化构造函数,但这会破坏抽象。
查看
<navigation:Page x:Class="QSmart.DataViewer.Report.RecentFailures.Report"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:local="clr-namespace:QSmart.DataViewer.Report.RecentFailures"
d:DesignWidth="640" d:DesignHeight="480"
Title="Report Page" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">
<UserControl.Resources>
<local:ReportViewModel x:Key="ViewModel"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" DataContext="{StaticResource ViewModel}" >
<telerik:RadGridView Name="RadGridView1" ItemsSource="{Binding Path=Faults,Mode=OneWay}" AutoGenerateColumns="True" />
</Grid>
</navigation:Page>
查看模型
Public Sub New(ByVal serviceDataAgent As IRecentFailuresReportServiceAgent)
If Not IsInDesignMode Then
If serviceDataAgent IsNot Nothing Then
ServiceAgent = serviceDataAgent
End If
Messenger.Default.Register(Of RecentFailuresMessage)(Me, Sub(m) ChangeReportSettings(m))
LoadData()
End If
End Sub
解决这个问题的方法是什么?是否建议使用视图后面的代码传递给参数化构造函数然后绑定到viewmodel?
答案 0 :(得分:1)
您可以使用IoC容器来创建对象,包括视图和视图模型。执行此操作时,如果可能,容器将尝试通过视图模型满足所有需要的组件。