繁体   English   中英

XAML将控件属性绑定到指定的样式

[英]XAML Bind control property to assigned style

我想要实现的是,为TextBlock控件创建一个样式,该控件在鼠标悬停时根据TextBlock所持有的项目数量进行高度缩放。
我的方法是获取项目金额并将其传递给转换器,该转换器返回TextBlock.Height * items.count但我遇到了麻烦。 此外,我希望这种风格只触发我的ListView的一列,而不是所有,但我还没有想过如何做到这一点。
目前我的XAML代码如下所示:

<ListView ItemsSource="{Binding SwItemToPopulate}" Name="lvSoftware" DockPanel.Dock="Top" Margin="10,10,10,10" MinHeight="325" Height="Auto" Width="Auto">
<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Height">
                    <Setter.Value>
                        <Binding 
                            Path="Dependencies.Count"
                            Converter="{StaticResource ItemCountToTextBoxHeightConverter}"
                            ConverterParameter="TextBlock.Height" />
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</ListView.ItemContainerStyle>
<ListView.View>
    <GridView>
        <GridViewColumn Header="Dependencies">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Dependencies}"/>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView>
</ListView.View>

这是我的转换器:

namespace test.Converter
{
class ItemCountToTextBoxHeightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType != typeof(double))
            throw new InvalidOperationException("The target must be an Integer"); 

        int tbHeight = (int)parameter;
        return (Double)value * tbHeight;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

}
}

如果我将一个Brakepoint设置为转换器,我可以看到value参数为0,参数是TextBlock.Height是这个,因为我的绑定是错误的,或者这是不可能的,我正在尝试做什么?

编辑我现在正在使用工具提示来实现这一目标。 感谢大家的好评和答案!

TextBlock不是为处理这种情况而设计的。 您应该使用ItemsControl

GridViewColumn.CellTemplate更改为ItemsControl将实现此目的。

话虽如此,尝试使用TextBlock.ActualHeight而不是Height

您可以反转属性触发器,以便在鼠标未结束时将项目重置为正常高度,因此可以将文本块高度绑定到Dependency.Count。 我将正常高度硬编码为20,因为我不确定如何做到这一点。

<ListView ItemsSource="{Binding Items}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="False">
                    <Setter Property="Height" Value="20"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Dependencies">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Dependencies}" 
                                    Height="{Binding Path=Dependencies.Count, Converter={StaticResource ItemCountToTextBoxHeightConverter}, ConverterParameter=20}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM