XAML UpdateSourceTrigger未应用于样式化控件

jvidinwx  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(97)

我最近在stackoverflow的帮助下解决了一个样式问题…(你可以在我的历史中看到问题/答案)
因此,我提出了以下样式来应用于特定的文本框。

<!--Expanding text box with the max width in the tag property-->
<!---->
<!--Will not work with password box!!-->
<Style TargetType="{x:Type TextBox}"
       x:Key="ExpandingTextBoxMaxWidthInTag">
    <Setter Property="OverridesDefaultStyle"
            Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*">
                            <ColumnDefinition.MaxWidth>
                                <Binding Path="Tag"
                                         RelativeSource="{RelativeSource TemplatedParent}">
                                </Binding>
                            </ColumnDefinition.MaxWidth>
                        </ColumnDefinition>
                        <ColumnDefinition Width="0*" />
                    </Grid.ColumnDefinitions>
                    <TextBox>
                        <TextBox.Text>
                            <Binding Path="Text"
                                     RelativeSource="{RelativeSource TemplatedParent}" />
                        </TextBox.Text>
                        <TextBox.MaxWidth>
                            <Binding Path="Tag"
                                     RelativeSource="{RelativeSource TemplatedParent}" />
                        </TextBox.MaxWidth>
                    </TextBox>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

(代码列表1)

然后我将其应用于代码中的文本框,如下所示...

<TextBox Tag="150"
         Text="{Binding Path=Username}"
         Style="{StaticResource ExpandingTextBoxMaxWidthInTag}" />

(代码列表2)

我必须强调,正如所写的那样,这段代码可以按预期工作。当我将 UpdateSourceTrigger=PropertyChanged 添加到 *Text * 属性上的绑定时,就会出现问题...

<TextBox Tag="150"
         Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged}"
         Style="{StaticResource ExpandingTextBoxMaxWidthInTag}" />

(代码列表3)

清单3中的代码可以正常工作,但有一个例外:更新源触发器不适当地激发。它不是在每次击键时触发(就像没有应用样式时一样),而是只在失去焦点事件(默认)时触发。
我不能简单地在样式中显式地应用“PropertyChanged”,因为我需要将样式应用于一堆TextBox,这些TextBox对更新源触发器有不同的需求。
我怎样才能在我的xaml中获得指定的更新源触发器来过滤到我的样式?

pb3s4cty

pb3s4cty1#

你用你的样式覆盖了“文本”属性,因此也覆盖了“UpdateSourceTrigger=PropertyChanged”部分,不是吗?只要删除样式中的“文本”属性绑定,这应该可以正常工作。

ukqbszuj

ukqbszuj2#

很抱歉这么晚才接电话。因为我也遇到过这个问题,我觉得无论如何都有必要在这里发表。

问题

据我所知,您的样式化文本框无法在每次击键时触发UpdateSource事件,因为控件模板中的文本框在Text属性中将UpdateSourceTrigger设置为默认值。

解决方案

只需要在控制模板中设置UpdateSourceTrigger

<Style TargetType="{x:Type TextBox}"
               x:Key="ExpandingTextBoxMaxWidthInTag">
            <Setter Property="OverridesDefaultStyle"
                    Value="True" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TextBox">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="1*">
                                    <ColumnDefinition.MaxWidth>
                                        <Binding Path="Tag"
                                                 RelativeSource="{RelativeSource TemplatedParent}">
                                        </Binding>
                                    </ColumnDefinition.MaxWidth>
                                </ColumnDefinition>
                                <ColumnDefinition Width="0*" />
                            </Grid.ColumnDefinitions>

                            <!-- Code with changes -->
                            
                            <TextBox>
                                <TextBox.Text>
                                    <Binding Path="Text" RelativeSource="{RelativeSource TemplatedParent}"
                                             UpdateSourceTrigger="PropertyChanged"/>
                                </TextBox.Text>

                                <TextBox.MaxWidth>
                                    <Binding Path="Tag"
                                             RelativeSource="{RelativeSource TemplatedParent}" />
                                </TextBox.MaxWidth>
                            </TextBox>
                            
                            <!-- /Code with changes -->
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

相关问题