【问题标题】:Adding a converter to Binding="{Binding}"将转换器添加到 Binding="{Binding}"
【发布时间】:2013-10-22 11:33:21
【问题描述】:

我有一个 DataGridColumnHeader 样式,它有一个位于 DataGridColumn 上方的 TextBox。在 TextBox 样式中,有一个 DataTrigger,它根据 DataGridColumn 中的文本设置其可见性。我不想检查它的值是否等于“Pos”,而是想使用一个转换器来查看它的值是否以字符串“Pos”开头。但是当我添加转换器时,转换器中的 value 参数结果不是字符串。相反,它是数据网格所属的 MainWindow 对象。为什么当我添加转换器时它会呈现不同的含义?

<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="DataGridColumnHeaderStyle"
            xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
    <Style.Resources>
        <SolidColorBrush x:Key="borderBackground">#E4E5ED</SolidColorBrush>
    </Style.Resources>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                <Border Background="{StaticResource borderBackground}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition />
                        </Grid.RowDefinitions>

                        <TextBox Margin="1" Grid.Column="0" Grid.Row="0" IsReadOnly="True"
                                Text="{Binding Path=DataContext.TotalPos, StringFormat=N0, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGrid}}}">
                            <TextBox.Style>
                                <Style TargetType="TextBox">
                                    <Setter Property="Visibility" Value="Hidden"/>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding}" Value="Pos">
                                            <Setter Property="Visibility" Value="Visible"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBox.Style>
                        </TextBox>

                        <theme:DataGridHeaderBorder Grid.Column="0" Grid.Row="1" SortDirection="{TemplateBinding SortDirection}"
                                 IsHovered="{TemplateBinding IsMouseOver}"
                                 IsPressed="{TemplateBinding IsPressed}"
                                 IsClickable="{TemplateBinding CanUserSort}"
                                 Background="{TemplateBinding Background}"
                                 BorderBrush="{TemplateBinding BorderBrush}"
                                 BorderThickness="{TemplateBinding BorderThickness}"
                                 Padding ="{TemplateBinding Padding}"
                                 SeparatorVisibility="{TemplateBinding SeparatorVisibility}"
                                 SeparatorBrush="{TemplateBinding SeparatorBrush}">

                            <TextBlock Grid.Column="0" Grid.Row="1"  Text="{TemplateBinding  Content}" 
                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                   TextWrapping="Wrap"></TextBlock>

                        </theme:DataGridHeaderBorder>
                        <Thumb Grid.Column="0" Grid.Row="1" Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}"/>
                        <Thumb Grid.Column="0" Grid.Row="1" Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

带转换器:

<src:StartsWith x:Key="startsWith"/>
...
<Style TargetType="TextBox">
    <Setter Property="Visibility" Value="Hidden"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding Converter={StaticResource startsWith}, ConverterParameter=Pos}" Value="True">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
...

[ValueConversion(typeof(string), typeof(bool))]
public class StartsWith : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((string)value).StartsWith((string)parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new Exception("Not Implemented.");
    }
}

【问题讨论】:

  • 如果我没记错的话,DataGridColumnHeaders 不是 DataGrid 的可视树的一部分,因此其中的绑定通常不会按预期工作。您的DataGridDataContext 是否设置为任何值?它可能设置为 MainWindow 对象,因此被 DataGridColumnHeader 继承
  • 是的,它设置为 MainWindow 对象。我只是不确定为什么 {Binding} 表达式将不再是列标题
  • 它从来不是列标题。
  • 好的,我可以用这个&lt;DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridColumnHeader, AncestorLevel=1}, Path=Column.Header, Converter={StaticResource startsWith}, ConverterParameter=Pos}" Value="True"&gt;绑定它了,谢谢

标签: wpf data-binding converter


【解决方案1】:

它不知道要绑定什么...为转换器添加Binding RelativeSource={RelativeSource Self}, Path=Text

【讨论】:

    【解决方案2】:

    我绑定了这个,谢谢

    <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridColumnHeader, AncestorLevel=1}, Path=Column.Header, Converter={StaticResource startsWith}, ConverterParameter=Pos}" Value="True">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多