Использование MultiDataTrigger для проверки 0 и логического значения в TextBox, имеющего StringFormat в XAML - PullRequest
1 голос
/ 29 мая 2020

У меня есть TextBox, привязанный к десятичному значению, которое я хочу отформатировать, чтобы десятичные значения не отображались, если они равны нулю. В то же время я хочу изменить цвет фона на цвет, если значение свойства равно нулю, а другое логическое свойство истинно.

Мне удалось добиться того и другого, но не вместе. Если я удалю StringFormat из привязки текста под фоном, он будет работать отлично, но значение, например, 10 отображается как 10,00, что мне не нужно. Для StringFormat Фон не установлен, а TextBox пуст, когда 0, и подавляет десятичные дроби, если они равны нулю, как требуется (пустая строка для нуля допустима). Поэтому я предполагаю, что это связано с пустой строкой. Я попытался проверить пустую строку с Path=Text.IsEmpty и value="True", как было предложено в другом сообщении, но это дает ошибку времени разработки, что свойство IsEmpty не найдено в типе String.

Это то, что У меня пока есть:

    <TextBox x:Name="FactorValueTextBox" Text="{Binding Value, StringFormat={}{0:# ###.##}}" IsReadOnly="{Binding CommodityGradingFactor.Total}" GotKeyboardFocus="GradeFactorGotKeyboardFocus">
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Text}" Value="0"/>
                        <Condition Binding="{Binding CommodityGradingFactor.Manditory}" Value="True"/>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Background" Value="LightPink"/>
                </MultiDataTrigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver" Value="True"/>
                        <Condition Property="IsReadOnly" Value="False"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="FontSize" Value="15"/>
                    <Setter Property="FontWeight" Value="Bold"/>
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

Для полноты, функция GotKeyboardFocus() просто выбирает текущее значение, когда пользователь переходит в TextBox:

private void GradeFactorGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    if (e.KeyboardDevice.IsKeyDown(Key.Tab))
        ((TextBox)sender).SelectAll();
}

1 Ответ

1 голос
/ 29 мая 2020

Вместо привязки условия к свойству Text

<Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Text}" Value="0"/>

Почему бы не привязать его к свойству Value

<Condition Binding="{Binding Value}" Value="0"/>

Примечание:

В зависимости от вашего варианта использования вы можете реализовать INotifyPropertyChanged в своем свойстве Value, избегайте называть свое свойство backfield как «значение», поскольку это Контекстные ключевые слова для INotifyPropertyChanged чехол.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...