ElementStyle DataTrigger

时间:2017-02-26 23:35:46

标签: c# wpf datatrigger

我遇到以下代码的问题。如果ivalueconverter(LengthConverter)决定第一个参数" Binding Path = Length"我试图用数据触发器做的是显示空白。在这种情况下小于ConverterParameter 3。

因此,对于那些真实的行,我会得到空白文本。否则我会得到我的数据。

问题如下,如果在Binding下面的第1行=" {Binding Data1}"省略,数据触发器工作正常,但是我无法编辑单元格值并让它触发Data1的设置器来更新数据。如果我有以下内容,我可以编辑数据,但触发器不再有效...

有什么方法可以让数据输入和数据触发工作吗?

<DataGridTextColumn Header="MyData1" Binding="{Binding Data1}">
<DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Text" Value="{Binding Data1, Mode=TwoWay}"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=Length, Converter={StaticResource LengthConverter}, ConverterParameter=3}" Value="True">
                <Setter Property="Text" Value="{x:Null}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGridTextColumn.ElementStyle>

谢谢!

1 个答案:

答案 0 :(得分:0)

我建议使用DataGridTemplateColumn自定义CellTemplateCellEditingTemplate,如下所示:

<DataGridTemplateColumn Header="MyData1">
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=Data1, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock >
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Text" Value="{Binding Path=Data1}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=Data1, Converter={StaticResource LengthConverter}, ConverterParameter=3}" Value="True">
                                <Setter Property="Text" Value="{x:Null}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

您的转换器现在应该指向Data1.Length:

LengthConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((value as string)?.Length??0) > 3;
    }
}

在更改文本时,Length属性本身不会获得PropertyChanged事件。因此直接绑定到字符串Data1 ......