【问题标题】:Setting ItemTemplate based on CheckBox value根据 CheckBox 值设置 ItemTemplate
【发布时间】:2010-04-08 03:59:29
【问题描述】:

我有一个包含 CheckBox 和 ListBox 的 DataTemplate。当 CheckBox 被选中时,我想更改 ListBox 上的 ItemTemplate 属性以更改每个项目的外观。

现在,它看起来像这样:

<DataTemplate DataType={x:Type MyViewModel}>
   <DockPanel>       
      <CheckBox DockPanel.Dock="Bottom"
                Content="Show Details"
                HorizontalAlignment="Right"
                IsChecked="{Binding ShowDetails}" 
                Margin="0 5 10 5" />

      <ListBox ItemsSource="{Binding Items}"
               ItemTemplate="{StaticResource SimpleItemTemplate}"
               Margin="10 0 10 5">
         <ListBox.Triggers>
            <DataTrigger Binding="{Binding ShowDetails}" Value="True">
               <Setter Property="ItemTemplate"
                       Value="{StaticResource DetailedItemTemplate}" />
            </DataTrigger>
         </ListBox.Triggers>
      </ListBox>
   </DockPanel>
</DataTemplate>

但是,当我尝试编译时,我收到以下错误消息:

值“ItemTemplate”无法分配给属性“Property”。无效的 PropertyDescriptor 值。

在“ContentPresenter”类型上找不到静态成员“ItemTemplateProperty”。

我对 WPF 还是很陌生,所以也许有一些我不太了解的地方?

【问题讨论】:

  • 更新:我意识到我可以只使用触发器而不是 DataTrigger,并将 SourceName 设置为 CheckBox,但无论如何,都会发生同样的错误。

标签: c# .net wpf


【解决方案1】:

您需要通过 ListBox Style 而不是直接通过其 Triggers 集合来执行此操作。 FrameworkElement 的 Triggers 集合只能包含 EventTriggers(所以我很惊讶您的示例竟然抱怨这些属性!)。以下是您需要做的:

<ListBox ItemsSource="{Binding Items}">
  <ListBox.Style>
    <Style TargetType="ListBox">
      <Setter Property="ItemTemplate" Value="{StaticResource SimpleItemTemplate}" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding ShowDetails}" Value="True">
           <Setter Property="ItemTemplate"
                   Value="{StaticResource DetailedItemTemplate}" />
        </DataTrigger>
     </Style.Triggers>
   </Style>
  </ListBox.Style>
</ListBox>

【讨论】:

    猜你喜欢
    • 2017-01-10
    • 2012-05-26
    • 2012-03-18
    • 2011-08-03
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多