Michael____ Ответов: 0

Vb.net WPF datatrigger не работает, если значение триггера является целочисленным


Уважаемое сообщество,

в моем проекте WPF я столкнулся со странным поведением: я хочу обновить содержимое метки с помощью DataTrigger если целочисленное значение достигает 0 (нуля). К сожалению, это не работает, но для строковых значений (= текст, а не числа как текст) это работает. Даже если я преобразую целое число в строку через .ToString() или CType() это не работает. Чтобы еще раз проверить, что я создал новый проект WPF, но здесь у меня та же проблема. Отладчик не сообщает об ошибке.

Мой XAML нового проекта:

<Window x:Class="MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <Label Name="lbl">
            <Label.Style>
                <Style TargetType="Label">
                    <Setter Property="Content" Value="Ready" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=lbl, Path=Content}" Value="0">
                            <Setter Property="Content" Value="Done" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Label.Style>
        </Label>
        <Button Name="btn" Content="Start" Click="btn_Click_1" />
    </StackPanel>
</Window>

За код :

Imports System.Threading

Class MainWindow
    Private i As Integer = 0

    Private Async Sub btn_Click_1(sender As Object, e As RoutedEventArgs)
        i += 1

        Await Task.Run(Sub()
                           Thread.Sleep(2000)
                       End Sub)

        i -= 1
        lbl.Content = i
    End Sub
End Class

Причина, по-видимому, заключается в типе данных (Integer), даже если свойство Value использует тип данных Object и должно иметь возможность работать с целыми числами.

Поскольку я не знаю, как с этим справиться, я ценю любую помощь. Спасибо!

Что я уже пробовал:

Я попытался преобразовать целое число в строку. Даже если я создам отдельную строковую переменную и возьму оттуда значение это не сработает:

Я как integer = 0
Private si As String = ""
...
i -= 1
си = я.Метод toString()
ЛБЛ.Содержание = Си

Richard Deeming

Await Task.Run(Sub()
    Thread.Sleep(2000)
End Sub)

Не делай этого! Вы прядете новую нить только для того, чтобы она спала в течение двух секунд.

Вместо этого используйте:
Await Task.Delay(2000)

Это меньше кода, его легче читать, и он более эффективен.

Michael____

спасибо за подсказку, сон был только примером, чтобы увидеть, что происходит ;-)

Richard Deeming

Кроме того, меня не убеждает идея использования триггера на Content свойство изменять Content собственность каждый раз, когда Content изменение свойства.

Вам было бы лучше использовать привязку с преобразователем значений:
Как конвертировать связанные данные - WPF | Microsoft Docs[^]

Gerry Schmitz

Content-это либо строка, либо UIElement; чистый int не является ни тем, ни другим.

0 Ответов