我正在使用PRISM自动连接我的视图& ViewModels,但是我遇到了一个我无法解决的问题。
我正在使用日历控件,它允许用户通过打开新的模态窗口来创建新的约会。将其保存到日历中。
此窗口通过ControlTemplate
设置样式,其中包含以下项目:
<telerik:RadComboBox Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" Margin="3"
ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.EmployeeList}">
项目此组合框的来源是ViewModels DataContext.EmployeeList - ObservableCollection<Employee>
。
只要它不是一个新的弹出窗口,这就像一个魅力。这样,我相信它也是一个userControl,因此我的常规代码无法识别任何EmployeeList
。
可能有两种方法可以解决它(我不能直接访问模态窗口,因为它是由控件本身自动生成的 - 我正在使用Telerik套件。)
1)确保ItemsSource比它找到的第一个UserControl
深入挖掘。也许通过稍微改变代码,它将能够这样做? (也许使用AncestorLevel ......?)。
2)Telerik已经展示了如何通过以下方式实现这一目标的示例:
<local:ViewModel x:Key="ViewModel" /> -- define key first
ItemsSource="{Binding Source={StaticResource ViewModel}, Path=EmployeesSource}"...
但是我的ViewModel的问题是在构造函数下我传递了几个interfaces
,如下所示:
private readonly IEmployeeRepository _employeeRepository;
public EmployeeView_HolidaysViewModel(IEmployeeRepository employeeRepository)
{
_employeeRepository = employeeRepository;
InitializeCollections();
InitializeCommands();
}
因此我无法使上述解决方案发挥作用。
对我的问题的任何帮助将非常感谢。我只需要将该列表放到该模态窗口的组合框中。
答案 0 :(得分:0)
最后,我设法通过为我的类创建额外的构造函数来解决问题,如下所示:
public EmployeeView_HolidaysViewModel()
{
_employeeRepository = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IEmployeeRepository>();
InitializeCollections();
}
这样我就可以轻松地从OP中采用 Solution Nr 2 。