gpt4 book ai didi

c# - 如何在属性更改时触发 DataTemplateSelector?

转载 作者:IT王子 更新时间:2023-10-29 04:11:12 26 4
gpt4 key购买 nike

我有 ContentPresenter 和 DataTemplateSelector:

    ...

public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var model = item as ItemControlViewModel;

if (model.CurrentStatus == PrerequisitesStatus.Required)
{
return RequiredTemplate;
}

if (model.CurrentStatus == PrerequisitesStatus.Completed)
{
return FinishedTemplate;
}

...

return InProgressTemplate;
}

当 CurrentStatus 改变时,调用 OnPropertyChanged。

我需要以某种方式在属性更改时触发此 DataTemplateSelector 并更改 ContentPresenter DataTemplate。有什么建议吗?

类似的问题有: 1 2 ,但我不想使用任何 DataTriggers,因为状态太多。

尝试使用 DataTriggers

    <ContentPresenter
Grid.Column="1"
Height="16"
Width="16"
Margin="3">
<ContentPresenter.Triggers>
<DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
<Setter Property="ContentPresenter.ContentTemplate" Value="{StaticResource ResourceKey=_requiredStatusTemplate}" />
</DataTrigger>
</ContentPresenter.Triggers>
</ContentPresenter>

但出现错误:触发器集合成员的类型必须是 EventTrigger :(

最佳答案

由于您在评论中请求了一个带有数据触发器的示例,所以您在这里:

FrameworkElement 只能有 EventTriggers,因此您会收到错误消息 Triggers collection members must be of type EventTrigger

并且也不要直接使用 ContentPresenter,它应该在 ControlTemplate 中使用。当您想要动态内容时,最好使用 ContentControl。参见 What's the difference between ContentControl and ContentPresenter?

最后,这是对您的 DataTrigger 问题的建议。我已将其放入可重用的样式中......

XAML:

<Window x:Class="WpfApplication88.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>

<DataTemplate x:Key="requiredTemplate">
<TextBlock Text="requiredTemplate"></TextBlock>
<!--your stuff here-->
</DataTemplate>

<DataTemplate x:Key="completedTemplate">
<TextBlock Text="CompletedTemplate"></TextBlock>
<!--your stuff here-->
</DataTemplate>

<Style x:Key="selectableContentStyle" TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Required">
<Setter Property="ContentTemplate" Value="{StaticResource requiredTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Completed">
<Setter Property="ContentTemplate" Value="{StaticResource completedTemplate}" />
</DataTrigger>
<!-- your other Status' here -->
</Style.Triggers>
</Style>

</Window.Resources>

<Grid>
<ContentControl Width="100" Height="100" Style="{StaticResource selectableContentStyle}"/>
</Grid>

</Window>

关于c# - 如何在属性更改时触发 DataTemplateSelector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715315/

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