UWP将ListView的项绑定为UserControl DataTemplate

时间:2016-07-26 14:29:56

标签: c# xaml mvvm datatemplate datacontext

我尝试实现主/详细视图,并尝试了解如何将所选项绑定到具有两个DataTemplate的UserControl中。

我有两种模式(我称之为老师和学生)

我的观点模型:

public class Page_ProfilVM : NotificationBase
{
    public ObservableCollection <AbstractInfosProfilVM> InfosProfil { get; set; }
    private AbstractInfosProfilVM selectedProfil;
    public  AbstractInfosProfilVM SelectedProfil
    {
        get { return selectedProfil; }
        set
        {
            SetProperty(selectedProfil, value, () => selectedProfil = value);
         }   
     }
}

public abstract class AbstractInfosProfilVM : NotificationBase
{
    private string nom;
    public  string Nom
    {
        get { return nom; }
        set { SetProperty(nom, value, () => nom = value); }
    }
}

public class TeacherInfosProfilVM : AbstractInfosProfilVM
{
}
public class StudentInfosProfilVM : AbstractInfosProfilVM
{
}

我正确显示了主视图

<!-- ListView -->
<ListView  ItemSource="{x:bind ViewModel.Profils}" 
           SelectionMode="Single" 
           SelectedItem="x:bind ViewModel.SelectedProfil, Mode="TwoWay", Converter={.....}}">

<ListView.ItemTemplate>
    <DataTemplate x:DataType="vm:AbstractProfilVM">
        <!-- Master -->
        <widget:CelProfilMaster CelProfilMasterName={x:Bind Name} CelProfilMasterAge={x:Bind Age} ... />
    </DataTemplate>
</ListView.ItemTemplate>

我正确地在详细视图上显示所选项目的详细信息(具有依赖项属性的用户控件)。但现在我需要选择正确的dataTempalte来显示教师的属性和学生的属性。但它确实有效。

<!-- Details-->
<widget:CelluleProfilDetails x:Name = "DetailContent" 
                             CelluleProfilDetailsNom = "{x:Bind ViewModel.SelectedProfil.Nom,Mode=TwoWay,Converter={StaticResource GenericConverter}}"
                             CelluleProfilDetailsPrenom = "{x:Bind ViewModel.SelectedProfil.Prenom, Mode=TwoWay,Converter={StaticResource GenericConverter}}" >

<widget:CelluleProfilDetails.CelluleProfilDetailsContent>
    <ContentPresenter Content="{x:Bind ViewModel.SelectedProfil,Mode=OneWay}">

    <ContentPresenter.Resources>
        <DataTemplate x:DataType="viewModels:TeacherInfosProfilVM" x:Name="T1" >
            <TextBlock Text="{x:Bind Nom}"/>
        </DataTemplate>
        <DataTemplate x:DataType="viewModels:StudentInfosProfilVM" x:Name="T2" >
            <TextBlock Text="{x:Bind Nom}"/>
        </DataTemplate>
    </ContentPresenter.Resources>

    </ContentPresenter>                        
</widget:CelluleProfilDetails.CelluleProfilDetailsContent>

</widget:CelluleProfilDetails>

我尝试显示教师/学生的名字,但它只显示视图模型的名称。 如何正确地将教师的属性和学生的属性显示为&#34; CelluleProfilDetails.CelluleProfilDetailsContent&#34; ?

1 个答案:

答案 0 :(得分:1)

如果您实际上正在寻找允许您根据数据类型将两个不同数据模板加载到View模型的数据绑定概念,那么您一定要查看下面的视频。

我在我的一个应用程序中实现了相同的功能,我不想在这里发布任何代码,因为它只是另一个复制粘贴解决方案。

See This Video

如果您对DataTemplateSelector的解释有任何问题,请告诉我。