【发布时间】:2018-03-27 22:07:28
【问题描述】:
问题:使用具有两个不同视图的单个视图模型。
我有一个Window 和一个控件ContentControl,它绑定到DataContext 中的一个属性,称为Object MainContent {get;set;}。基于 navigationType enum 属性,我将其他 ViewModel 分配给它以显示正确的 UserControl。
我需要将两个视图合并到一个 ViewModel 中,并且因为我将一个 ViewModel 分配给前面提到的 ContentControl,所以 TemplateSelector 无法识别哪个是正确的视图,因为它们共享相同的 viewModel
如果我将视图而不是 ViewModel 分配给 ContentControl,则会显示正确的视图,但是,所有命令都不起作用。
有什么帮助吗?提前致谢。
解决方案:基于@mm8 答案和https://stackoverflow.com/a/5310213/2315752:
ManagePatientViewModel.cs
public class ManagePatientViewModel : ViewModelBase
{
public ManagePatientViewModel (MainWindowViewModel inMainVM) : base(inMainVM) {}
}
ViewHelper.cs
public enum ViewState
{
SEARCH,
CREATE,
}
MainWindowViewModel.cs
public ViewState State {get;set;}
public ManagePatientViewModel VM {get;set;}
private void ChangeView(ViewState inState)
{
State = inState;
// This is need to force the update of Content.
var copy = VM;
MainContent = null;
MainContent = copy;
}
public void NavigateTo (NavigationType inNavigation)
{
switch (inNavigationType)
{
case NavigationType.CREATE_PATIENT:
ChangeView(ViewState.CREATE);
break;
case NavigationType.SEARCH_PATIENT:
ChangeView(ViewState.SEARCH);
break;
default:
throw new ArgumentOutOfRangeException(nameof(inNavigationType), inNavigationType, null);
}
}
MainWindow.xaml
<DataTemplate x:Key="CreateTemplate">
<views:CreateView />
</DataTemplate>
<DataTemplate x:Key="SearchTemplate">
<views:SearchView/>
</DataTemplate>
<TemplateSelector x:Key="ViewSelector"
SearchViewTemplate="{StaticResource SearchTemplate}"
CreateViewTemplate="{StaticResource CreateTemplate}"/>
<ContentControl
Grid.Row="1"
Content="{Binding MainContent}"
ContentTemplateSelector="{StaticResource ViewSelector}" />
模板选择器.cs
public class TemplateSelector : DataTemplateSelector
{
public DataTemplate SearchViewTemplate {get;set;}
public DataTemplate CreateViewTemplate {get;set;}
}
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (!(item is SelectLesionViewModel vm))
{
return null;
}
switch (vm.ViewType)
{
case ViewState.CREATE:
return CreateViewTemplate;
case ViewState.SEARCH:
return SearchViewTemplate;
default:
return null;
}
}
}
【问题讨论】:
-
当有两种视图模型类型映射到一个视图类型时,TemplateSelector 应该如何知道使用哪个模板?这根本没有意义。您应该使用两种不同的类型。
-
感谢您的回答@mm8,这就是我问的原因,我不知道该怎么做,或者我应该改变什么。你能给我指出正确的方向吗?跨度>
-
我发布了答案。