gpt4 book ai didi

c# - 一个 ViewModel 中的两个 View (WPF/MVVM)

转载 作者:行者123 更新时间:2023-12-03 10:54:11 26 4
gpt4 key购买 nike

问题:使用具有两个不同 View 的单个 View 模型。

我有一个 Window带控件ContentControl绑定(bind)到 DataContext 中的属性, 称为 Object MainContent {get;set;} .基于导航类型 enum属性,我将其他 ViewModel 分配给它以显示正确的 UserControl .

我需要将两个 View 合并到一个 ViewModel 中,因为我将 ViewModel 分配给 ContentControl前面提到过,TemplateSelector无法识别哪个是正确的 View ,因为两者共享相同的 viewModel

如果我将 View 而不是 ViewModel 分配给 ContentControl ,显示正确的 View ,但是,所有命令都不起作用。

有什么帮助吗?提前致谢。



解决方案:基于@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);
}
}

主窗口.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 怎么样应该知道当有两种 View 类型映射到单个 View 模型类型时要使用哪个模板?恐怕这毫无意义。

您应该使用两种不同的类型。您可以在公共(public)基类中实现逻辑,然后定义两个标记类型,它们只是从该实现派生并且不添加任何功能:

public class ManagePatientViewModel { */put all your code in this one*/ }

//marker types:

public class SearchPatientViewModel { }

public class CreatePatientViewModel { }

此外,如果您删除 x:Key,您实际上并不需要模板选择器。模板中的属性:
<DataTemplate DataType="{x:Type viewModels:SearchPatientViewModel}">
<views:SearchPatientView />
</DataTemplate>

<DataTemplate DataType="{x:Type viewModels:CreatePatientViewModel}">
<views:CreatePatientView />
</DataTemplate>

...
<ContentControl
Grid.Row="1"
Content="{Binding MainContent}" />

关于c# - 一个 ViewModel 中的两个 View (WPF/MVVM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49428659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com