模板化父级在多重绑定中不起作用:每次都"UnsetValue"



我正在尝试将样式控件的可见性绑定到其标签等于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的属性,你绑定RelativeSourceSelf:

<Binding Path="Tag" RelativeSource="{RelativeSource Self}" />

OP还发现他必须将StyleTargetType设置为"UserControl",以使Tag绑定工作。

相关内容

  • 没有找到相关文章

最新更新