mxp*_*xpv 30 c# wpf datatemplateselector
我有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;
}
Run Code Online (Sandbox Code Playgroud)
更改CurrentStatus时,将调用OnPropertyChanged.
当属性发生更改并更改ContentPresenter DataTemplate时,我需要以某种方式触发此DataTemplateSelector.有什么建议?
Threre是类似的问题: 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>
Run Code Online (Sandbox Code Playgroud)
但得到一个错误:触发器集合成员必须是EventTrigger类型:(
Sve*_*enG 36
正如您在评论中请求数据触发器的示例,您在这里:
FrameworkElement只能有EventTriggers,因此您会收到错误消息 触发器集合成员必须是EventTrigger类型
并且也不要直接使用ContentPresenter,它应该在ControlTemplate中使用.当您想拥有动态内容时,最好使用ContentControl.看看ContentControl和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>
Run Code Online (Sandbox Code Playgroud)
我可能错了,但我相信DataTemplateSelector只有在ItemContainerGenerator为集合中添加项目创建容器时才会使用它.由于在属性值更改时未生成新容器,DataTemplate因此永远不会通过选择器应用new .
正如评论中所建议的那样,我建议您查看VisualStateManager或数据触发器,否则当一个或多个属性更改值时,您将不得不为每个项重新创建容器.
| 归档时间: |
|
| 查看次数: |
18529 次 |
| 最近记录: |