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 не является ни тем, ни другим.