我有 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/