Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何基于对象属性动态更新数据模板?_C#_Wpf_Xaml_Dynamic_Datatemplate - Fatal编程技术网

C# 如何基于对象属性动态更新数据模板?

C# 如何基于对象属性动态更新数据模板?,c#,wpf,xaml,dynamic,datatemplate,C#,Wpf,Xaml,Dynamic,Datatemplate,我有一组具有不同渲染选项的对象:它们可以是简单文本、可编辑文本、组合框或事件混合包(如组合框,其中项目通常为文本,但带有特定值的图像) 我通过在ListViewItem.ItemTemplate的DataTemplate中的ContentPresenter节点中使用ContentTemplateSelector正确显示了所有内容: (请注意,所有内容都在ListView.ItemTemplate的DataTemplate中) 在我更改所述属性的值并需要更改模板之前,一切都很好,例如从图像更改

我有一组具有不同渲染选项的对象:它们可以是简单文本、可编辑文本、组合框或事件混合包(如组合框,其中项目通常为文本,但带有特定值的图像)

我通过在
ListViewItem.ItemTemplate的
DataTemplate
中的
ContentPresenter
节点中使用
ContentTemplateSelector
正确显示了所有内容:


(请注意,所有内容都在
ListView.ItemTemplate
DataTemplate
中)

在我更改所述属性的值并需要更改模板之前,一切都很好,例如从图像更改为文本。 VM确实正确地更新了这些值,但GUI中没有发生任何事情

环顾这里,有几种方法(使用
转换器
(绑定到哪个属性??),定义
样式
(我认为不相关,因为我必须显示不同的控件,而不是更改同一个控件的属性),使用
附件属性
(我不太了解附加属性是如何工作的,但从我看到的情况来看,我应该有一个
ContentControl
节点,我没有…),但我似乎什么都不需要


因此,回顾一下:我有一个ListView,它为每个
ListViewItem
定义了一个
DataTemplate
,其中包含另一个
DataTemplate
,需要根据
ListViewItem
对象的属性进行更改。我使用
ContentTemplateSelector
实现了这一点,但它是在开始时分配的ning,然后从未更改。

您可以尝试将
ContentPresenter
替换为
ContentControl
,该控件具有
样式,并带有设置
ContentTemplate
的数据触发器。例如:

<ContentControl Content="{Binding}">
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Style.Triggers>
                <DataTrigger Binding="{Binding YourProperty}" Value="Type1">
                    <Setter Property="ContentTemplate" Value="{StaticResource template1}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding YourProperty}" Value="Type2">
                    <Setter Property="ContentTemplate" Value="{StaticResource template2}" />
                </DataTrigger>
                <!-- ... -->
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>


这有帮助吗?或者可能是黑客正在删除该项并将其重新插入列表中。当您希望通过数据类型指定视觉外观时,通常会使用数据模板。我需要更多地了解您尝试执行的操作的具体情况,但听起来您实际上需要的是外观由一个值控制。如果是这样,那么您需要的是一个DataTrigger。无论哪种方式,当您恢复使用代码隐藏时,无论是以转换器或模板选择器等形式,您都可能做错了!