问题描述
我有一个带有 ItemTemplateSelector
的 ComboBox,使用 2 个不同的 DataTemplate
,一个用于下拉可见,另一个用于不可见。对于下拉模板,每个 ComboBox 项目都由一个 TextBlock
和一个 Button
表示,它们应该只在该项目被聚焦/突出显示/鼠标悬停时可见。这是我试过的:
<ComboBox x:Name="Windows" ItemsSource="{Binding Windows}" SelectedItem="{Binding Window}" Focusable="False" MaxDropDownHeight="238">
<ComboBox.ItemTemplateSelector>
<s:ComboBoxItemTemplateSelector>
<s:ComboBoxItemTemplateSelector.SelectedTemplate>
<DataTemplate>
<TextBlock Text="{Binding TitleShort}" ToolTip="{Binding Title}" />
</DataTemplate>
</s:ComboBoxItemTemplateSelector.SelectedTemplate>
<s:ComboBoxItemTemplateSelector.DropDownTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding TitleShort}" />
<Button Content="X">
<Button.Style>
<Style targettype="Button">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsFocused,ElementName=Windows}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</StackPanel>
</DataTemplate>
</s:ComboBoxItemTemplateSelector.DropDownTemplate>
</s:ComboBoxItemTemplateSelector>
</ComboBox.ItemTemplateSelector>
<ComboBox.ItemContainerStyle>
<Style BasedOn="{StaticResource MaterialDesignComboBoxItemStyle}" targettype="ComboBoxItem">
<Setter Property="ToolTip">
<Setter.Value>
<TextBlock Text="{Binding Title}" />
</Setter.Value>
</Setter>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
public class ComboBoxItemTemplateSelector : DataTemplateSelector
{
public DataTemplate SelectedTemplate { get; set; }
public DataTemplate DropDownTemplate { get; set; }
public override DataTemplate SelectTemplate(object item,DependencyObject container)
{
ComboBoxItem comboBoxItem = GetVisualParent<ComboBoxItem>(container);
if (comboBoxItem == null)
{
return SelectedTemplate;
}
return DropDownTemplate;
}
private static T GetVisualParent<T>(object childobject) where T : Visual
{
DependencyObject child = childobject as DependencyObject;
while ((child != null) && !(child is T))
{
child = VisualTreeHelper.GetParent(child);
}
return child as T;
}
}
解决方法
ComboBox 生成 ComboBoxItem 作为其 itemssource 中每个项目的容器。您可以使用 RelativeSource 绑定绑定到其属性。
这应该会让你得到预期的行为:
WHERE
st_contains(a.geometrie,b.geometrie) AND
st_contains(a.geometrie,b.geometrie) AND
st_covers(a.geometrie,b.geometrie) AND
st_coveredby(a.geometrie,b.geometrie) AND
st_intersects(a.geometrie,b.geometrie)
AND st_disjoint(a.geometrie,b.geometrie)
AND st_equals(a.geometrie,b.geometrie)
AND a.GID = '142284 '
GROUP BY b.SOUS_TYPE,b.TYPE_PRESCRIPTION,a.geometrie,b.geometrie,b.TRIG_COMM