WPF显示带有DataTrigger的控件,在TabOrder中跳过它

问题描述 投票:0回答:1

当前一个TextBox的值不是0.00(零)时,我想显示“其他详细信息”文本框。这可以通过DataTriggers轻松完成:

<TextBox Name="FirstTB" Text="{Binding Amount, StringFormat=F2}"/><!--when this TB is not 0-->
<TextBox Name="SecondTB"> <!--show this TB-->
    <TextBox.Style>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Amount}" Value="0">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>
<TextBox Name="ThirdTB"/>

但是,问题是,当将FirstTB的值更改为<> 0并按Tab时,焦点跳到了[[ThirdTB而不是SecondTB(即使SecondTB现在可见)由于有DataTrigger)。如何解决此问题?


可悲的是,UpdateSourceTrigger=PropertyChanged由于受StringFormat干扰而似乎不是一个选项-在编辑值时它提供了糟糕的UX,由于对StringFormat的不断评估,carret像疯了似的跳来跳去。上例中使用的Viewmodel:

public class MyVM : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private double _amount; public double Amount { get { return _amount; } set { _amount = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Amount))); } } }

wpf xaml datatrigger tab-ordering
1个回答
0
投票
也许是个愚蠢的工作。但这可以完成工作:

private void SecondTB_OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if (((bool) e.NewValue)) { if(!(sender is TextBox txbx)) return; ThirdTB.GotFocus += ThirdTbOnGotFocus; } } private void ThirdTbOnGotFocus(object sender, RoutedEventArgs e) { SecondTB.Focus(); ThirdTB.GotFocus -= ThirdTbOnGotFocus; }

© www.soinside.com 2019 - 2024. All rights reserved.