Wpf 条件DataTemplate返回对象

Wpf 条件DataTemplate返回对象,wpf,mvvm,binding,itemscontrol,datatrigger,Wpf,Mvvm,Binding,Itemscontrol,Datatrigger,对于学校项目,我需要一个问题对象的选择性模板。根据其类型,我必须显示不同的类型(类型有:打开、多选和关闭) 我定义了如下模板 <ResourceDictionary> <UserControl.Resources> <DataTemplate x:Key="Open" > <WrapPanel> <Label Content="Open"/>

对于学校项目,我需要一个问题对象的选择性模板。根据其类型,我必须显示不同的类型(类型有:打开、多选和关闭)

我定义了如下模板

<ResourceDictionary>
    <UserControl.Resources>
        <DataTemplate x:Key="Open" >
            <WrapPanel>
                <Label Content="Open"/>
            </WrapPanel>
        </DataTemplate>
        <DataTemplate x:Key="multipleChoice" >
            <WrapPanel>
                <Label Content="multipleChoice"/>
            </WrapPanel>
        </DataTemplate>
        <DataTemplate x:Key="Closed" >
            <WrapPanel>
                <Label Content="Closed"/>
            </WrapPanel>
        </DataTemplate>
    </ResourceDictionary>
</UserControl.Resources>
我绑定到我的问题模型,看起来像这样

public class Question 
{
    public Question() 
    {
        this.Answers = new ObservableCollection<Answer>(); 
    } 

    [Key] 
    public virtual int Id { get; set; } 
    public String QuestionContent { get; set; } 
    public string OpenAnswer { get; set; } 
    public string type { get; set; } 
    public virtual ObservableCollection<Answer> Answers { get; set; } 
    public virtual Questionaire Questionaire { get; set; } }
}
公开课问题
{
公众问题(
{
this.Answers=新的ObservableCollection();
} 
[关键]
公共虚拟整数Id{get;set;}
公共字符串QuestionContent{get;set;}
公共字符串OpenAnswer{get;set;}
公共字符串类型{get;set;}
公共虚拟可观察集合回答{get;set;}
公共虚拟问卷{get;set;}}
}
我做错什么了吗?我怎样才能解决这个问题


更新:问题解决了。给出的例子是正确的。数据库提供的数据不正确,导致错误。

数据模板设计用于类型。。。与在
系统中一样。键入
。它们是交换设计用于与特定类型交互的UI元素的简单方法。你所做的可能是滥用这个。原因如下

为了以这种方式使用DataTemplates,您必须重构它(我认为您拥有的)

但是,为了正确使用数据模板,您必须将测试类型表示为实际类型。我的意思是:

// describes a type of test
abstract class TestType { }
// implementations of this type
class OpenBookTest : TestType {}
class ClosedBookTest : TestType {}
class MultipleTypeTest : TestType {}
您必须通过视图模型的属性公开这种类型的实例

class Mahveurmerder
{
  public TestType type {get;set;}
}
在模板上指定数据类型后:

<DataTemplate 
    xmlns:models="clr-namespace:ermagerdmerassinmernt.models"
    DataType="{x:Type OpenBookTest:}" >
    <WrapPanel>
        <Label Content="Open"/>
    </WrapPanel>
</DataTemplate>
在ItemsControl.ItemTemplate中(去掉所有其他的废话)



一旦您理解了模式,WPF就相当容易了。如果你陷入困境,停下来重新考虑一下你在做什么——可能有一个更简单的方法。

属性设置如何?你能验证这些值是你期望的吗

根据对象模型和您对
QuestionContent
的绑定有效的声明,看起来您已经正确设置了DataContext层次结构,因此最可能的问题原因是数据本身


我还注意到您没有在对象模型上实现
INotifyPropertyChanged
,因此,如果在对象绑定到后设置,则UI将不知道需要刷新。

我使用的是实体框架,类型不是模型/对象,而是属性。是否有其他方法可以使用给定的示例,因为在应用程序的其余部分使用类型时,无法在剩余时间内将类型转换为对象,这将导致许多功能中断。我知道你的例子会很好,就像我以前看到的那样,但我现在没有看到使用它的方法,除非有一种方法可以使用属性而不是类型到数据类型。@威尔,我不确定我是否理解你为什么认为这是滥用数据模板。为什么我们不应该使用DataTriggers有条件地检查绑定值,并根据值将ContentTemplate设置为不同的DataTemplate?“我有时在需要的时候做。”瑞秋考虑到他可能需要的东西(一个IValueConverter),这是一种虐待。就像尝试学习如何使用车床削棍子一样。@IMarks你没有读最后一部分——不要使用数据模板,使用IValueConverter将类型转换为适当的文本表示形式。@我猜如果他保留标签,那将是一个可靠的建议,但是因为OP说他现在正在使用标签进行测试,根据评论,听起来以后会使用不同的控件来显示数据,它们不会保留为标签。在这种情况下,我肯定会建议使用DataTemplates,而不是试图弄乱转换器。你能提出你的问题,包括你绑定到的数据对象的代码吗?我怀疑问题在于你的DataContext,因为
System.data.Entity.DynamicProxies
听起来像是实体框架的一部分,而不是您创建的自定义控件。这是正确的问题由实体框架提供。但这是一个怎样的问题呢?更重要的是,我如何解决这个问题?1/2我绑定到我的问题模型,它看起来像是
公共类问题{public question(){this.Answers=new observeCollection();}[Key]公共虚拟int Id{get;set;}公共字符串QuestionContent{get;set;}公共字符串OpenAnswer{get;set;}公共字符串类型{get;set;}公共虚拟可观察集合答案{get;set;}公共虚拟问卷调查问卷{get;set;}
2/2我是否可以获取开放式问题的文本字段,根据对象模型和您对
QuestionContent
的绑定有效的声明,选择“关闭”,并选中当前格式的multipleChoice?@IMarks,然后看起来您的DataContext层次结构设置正确。
类型
属性如何设置?我注意到您没有在对象模型上实现
INotifyPropertyChanged
,因此,如果在对象绑定到后设置,则UI将不知道它需要更新。至于你的第二个问题,我认为你现在拥有的XAML是好的。您正在绑定到一个对象集合,并使用
DataTrigger
检查属性并确定如何绘制每个对象,这就是我要做的。这太奇怪了。。。为什么他需要使用DataTemplates来切换基于字符串的标签?这是X/Y领域。这是临时数据(我不想让你提供我全部的学业,这意味着向我学习xD)。谢谢你的关注@Rachel。由于您的描述,我发现seed脚本在数据库中溢出了不一致的数据,其中Open和Closed通常被称为Open和Closed(小写)。修复后,它的工作。
class Mahveurmerder
{
  public TestType type {get;set;}
}
<DataTemplate 
    xmlns:models="clr-namespace:ermagerdmerassinmernt.models"
    DataType="{x:Type OpenBookTest:}" >
    <WrapPanel>
        <Label Content="Open"/>
    </WrapPanel>
</DataTemplate>
<ItemsControl ItemsSource="{Binding SelectedInspection.Questionaire.Questions}" />
<!-- up in your window's or app's Resources -->
<converters:MerTestTyerpCernverter x:Name="Duh" />
<Label Content="{Binding type, converter={StaticResource Duh}}"/>