如何基于复选框更改WPF中的ListBox数据模板
我试图应用如何基于复选框更改WPF中的ListBox数据模板,wpf,xaml,listbox,datatemplate,datatrigger,Wpf,Xaml,Listbox,Datatemplate,Datatrigger,我试图应用DataTrigger来更改列表框的DataTemplate,得到错误: “错误1找不到触发器目标'IssueListBox'。(目标必须出现在使用它的任何设置程序、触发器或条件之前)。” 在我的主窗口中有一个列表框(在DockPanel以及其他控件中): 如何使触发器工作?Google先生让我失望了,像这样的例子比比皆是,但它们不是基于另一个控件。您的数据模板是在app.xaml中定义的静态资源,您正在尝试将元素名称绑定到元素IssueListBox,而该元素不在同一范围内。即使这样
DataTrigger
来更改列表框的DataTemplate
,得到错误:
“错误1找不到触发器目标'IssueListBox'。(目标必须出现在使用它的任何设置程序、触发器或条件之前)。”
在我的主窗口中有一个列表框
(在DockPanel
以及其他控件中):
如何使触发器
工作?Google先生让我失望了,像这样的例子比比皆是,但它们不是基于另一个控件。您的数据模板是在app.xaml中定义的静态资源,您正在尝试将元素名称绑定到元素IssueListBox,而该元素不在同一范围内。即使这样,你想做的就是这样。Listbox有一个数据模板DT,在DT中,您试图返回列表框并将其数据模板设置为另一个(而不是DT)
为什么不合并这些模板,将细节的可见性设置为“折叠”,并根据属性触发可见性。然后,您根本不必引用列表框,模板保持不变,只需在需要查看详细信息时在内部更改即可。在DataTrigger中,您将ItemTemplate设置为包含它的DataTemplate-ShowIssueSimple。这只是打字错误吗?我猜你的意思是Value=“{StaticResource showsissuedetail}”。是的,是的,是一个“输入错误”(:感谢大家的提醒,修正了这一点,尽管我仍然在想,如果我需要两个模板,我会如何处理它。当我刚刚在checked.changed事件中添加了一个事件处理程序时,生活变得轻松多了,但是我正在努力培养更好的习惯,因为我正在学习并在学习xaml的同时尽可能多地使用MVVMish使用数据模板选择器,但这是在添加数据模板时,而不是在属性更改时,在数据模板之间进行选择。
<ListBox x:Name="IssueListBox"
ItemsSource="{Binding}"
ItemTemplate="{StaticResource ShowIssueSimple}"
IsSynchronizedWithCurrentItem="True"
HorizontalContentAlignment="Stretch"
BorderThickness="3" DockPanel.Dock="Top"
VerticalContentAlignment="Stretch" Margin="2"/>
<DataTemplate x:Key="ShowIssueDetail">
<Border CornerRadius="4, 8, 4, 8" Margin="2" MinWidth="400" BorderThickness="3"
BorderBrush="{Binding Path=IssUrgency, Converter={StaticResource IntToRYGBBoarderBrushConverter}}">
<StackPanel Orientation="Horizontal">
<StackPanel Margin="10">
<TextBlock Text="{Binding IssSubject}" FontWeight="Bold" FontSize="14"/>
<StackPanel Width="Auto" Orientation="Horizontal">
<TextBlock Text="Due: " FontWeight="Bold"/>
<TextBlock Text="{Binding IssDueDate}" FontStyle="Italic" HorizontalAlignment="Left"/>
</StackPanel>
<StackPanel Width="Auto" Orientation="Horizontal">
<TextBlock Text="Category: " FontWeight="Bold"/>
<TextBlock Text="{Binding IssCategory}"/>
</StackPanel>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
<DataTemplate x:Key="ShowIssueSimple">
<Border CornerRadius="6"
Margin="2,1,2,1"
MinWidth="400"
BorderThickness="2"
SnapsToDevicePixels="True"
BorderBrush="{Binding Path=IssUrgency, Converter={StaticResource IntToRYGBBoarderBrushConverter}}">
<StackPanel Margin="5">
<TextBlock Text="{Binding IssSubject}" FontWeight="Bold" FontSize="14"/>
</StackPanel>
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Source={StaticResource sbvm}, Path=ShowDetailListItems}" Value="True">
<Setter TargetName="IssueListBox" Property="ItemTemplate" Value="{StaticResource ShowIssueDetail}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>