显示带有DataTrigger的控件的WPF按TabOrder跳过它

显示带有DataTrigger的控件的WPF按TabOrder跳过它,wpf,xaml,datatrigger,tab-ordering,Wpf,Xaml,Datatrigger,Tab Ordering,当上一个文本框的值不是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>

当上一个
文本框
的值不是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"/>

也许是一个愚蠢的工作。但这将起到作用:

视图:


如果您使用
IValueConverter
,您将获得解决问题的非常优雅的方法。每次更改值时,都会调用逻辑


公共类为ZeroToHiddenConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
if(值为双d&&d==0)
返回可见性。隐藏;
返回可见性。可见;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
您也可以随意选择并添加
ConverterParameter
,以决定是希望
折叠
还是
隐藏
行为

用法

预览

您对字符串格式的干扰是什么意思?这是可能的:
你有没有试过使用
IsTabStop=“True”TabIndex=“1”
@NawedNabiZada我的任务是不惜一切代价避免
UpdateSourceTrigger=PropertyChanged
,因为它提供了糟糕的用户体验-当你编辑值时,carret会因为不断的StringFormat求值而疯狂地跳来跳去。好吧,这很有意义。。。也许可以把它添加到问题中,因为它不清楚你实际上在做什么meant@NawedNabiZada好主意。遗憾的是,设置显式TabOrder没有任何效果,它仍然被跳过(只是尝试了一下)。虽然不是最优雅的解决方案,但它确实有效-让我等一天,如果没有更好的解决方案,我会接受它。感谢您指出DataTriggers的替代方案,然而,Covenerters也面临着同样的问题:除非存在
UpdateSourceTrigger=PropertyChanged
,否则无法工作,而且由于用户体验,我们无法使用UpdateSourceTrigger=PropertyChanged,这会导致奇怪的插入符号行为(每当计算绑定时跳到小数点后一位)。例如,当您选择文本并尝试键入“1.5”时,它将显示“1.5.00”,并变为红色。
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)));
        }
    }

}
<TextBox Name="SecondTB" IsVisibleChanged="SecondTB_OnIsVisibleChanged">
     <!--show this TB-->
     <TextBox.Style>
         <Style TargetType="{x:Type TextBox}">
              <Style.Triggers>
                    <DataTrigger Binding="{Binding Amount, Mode=OneWay}" Value="0">
                         <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
              </Style.Triggers>
         </Style>
    </TextBox.Style>
</TextBox>
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;
}