我正在尝试将样式控件的可见性绑定到其标签等于TabControl的选定索引的条件。
我使用RelativeSource TemplatedParent
,但它没有被设置,我怀疑这是因为我没有设置Template
属性的风格。
<Grid x:Name="Telas" Grid.Column="1">
<Grid.Resources>
<vw:TagIsIndexBooleanConverter x:Key="TagIsIndexBooleanConverter"/>
<Style x:Key="SelectedIndexVisibleStyle" TargetType="UserControl">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource TagIsIndexBooleanConverter}">
<Binding Path="Tag" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Path="SelectedIndex" ElementName="menu"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<vw:TelaColetaView
x:Name="telaColeta"
DataContext="{Binding TelaColetaVM}"
Style="{StaticResource SelectedIndexVisibleStyle}"
Tag="0"/>
<vw:TelaPacientesView
x:Name="telaPacientes"
DataContext="{Binding TelaPacientesVM}"
Style="{StaticResource SelectedIndexVisibleStyle}"
Tag="1"/>
<vw:TelaConfiguraçõesView
x:Name="telaConfigurações"
DataContext="{Binding TelaConfiguraçõesVM}"
Style="{StaticResource SelectedIndexVisibleStyle}"
Tag="4"/>
</Grid>
和转换器:
public class TagIsIndexBooleanConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Any(v => v == null || v == DependencyProperty.UnsetValue))
return Binding.DoNothing;
var tag = System.Convert.ToInt32(values[0]);
var index = System.Convert.ToInt32(values[1]);
var result = tag == index;
return result;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
你不能在这种情况下使用TemplatedParent
,因为没有一个;这意味着在ControlTemplate
中使用,以指定绑定的源是将模板应用于的控件。
<Binding Path="Tag" RelativeSource="{RelativeSource TemplatedParent}"/>
但这不是在ControlTemplate
内。相反,Tag
只是一个属性的东西,你的样式。通常你会为Tag
:
<Trigger Property="Tag" Value="0">
…但是你需要一个多绑定来从menu
中获得SelectedIndex
,并且它必须是MultiDataBinding
,因为你需要指定ElementName
。
所以你需要绑定。要绑定到你自己的一个属性,而不是你的DataContext
的属性,你绑定RelativeSource
的Self
:
<Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
OP还发现他必须将Style
的TargetType
设置为"UserControl"
,以使Tag
绑定工作。