我有以下代码。 (旨在从代码中打开视图模型)。
private void OpenView<viewType,viewModelType> (object parameters) {
//STEP 1. CREATE THE VIEW
var view = (viewType)Activator.CreateInstance(typeof(viewType));
//STEP 2. SET THE DATACONTEXT
var viewModel = (viewModelType)view.DataContext;
//STEP 3. OPEN THE WINDOW AND WAIT UNTIL MANUALLY CLOSED
TestWindow window = new TestWindow();
window.LayoutRoot.Children.Add(view);
window.Activate();
window.ShowDialog();
}
编译器给我以下错误;
错误CS1061'viewType'不包含针对的定义 “ DataContext”并且没有扩展方法“ DataContext”接受第一个 可以找到类型'viewType'的参数(您是否缺少 指令还是程序集引用?)
我无法在步骤2中访问DataContext,因为我认为编译器不知道视图变量是什么类型。谁能告诉我如何告诉编译器视图变量是什么类型?如果不可能的话。如何解决呢?
答案 0 :(得分:2)
这里有两个实际的解决方案。
viewType
始终是同一类型:所以请不要使其通用。 viewType
始终从相同的基类继承或实现公共接口。例如,它始终是具有FrameworkElement
属性的DataContext
。在这种情况下,您可以将泛型类型限制为该类:
private void OpenView<TViewType, TViewModelType>(object parameters)
where viewType : FrameworkElement // This is the magic sauce
{
var view = (TViewType)Activator.CreateInstance(typeof(TViewType));
// Now we can access the DataContext
var viewModel = (TViewModelType)view.DataContext;
//snip
}
PS这是很普遍的做法,在通用类型前面加上T